如何解决如果属性的值被覆盖,将会发生什么?
| 假设我创建了NSString类型的tempStr属性。 我很明显地合成了它。 在我的一种方法中,我将tempstr的值设置为yellowcolor。 然后就在那之后,我用redcolor重新初始化了tempStr。 所以我想知道在这种情况下tempStr的内存发生了什么。 谢谢解决方法
这取决于您为属性设置的属性:“ 0”,“ 1”或“ 2”。
@property (retain) NSString *tempStr
:将释放旧值(黄色),并保留新值(红色)。唯一的例外是yellowcolor == redcolor
。然后什么也不会发生,因为新旧值是相同的。
@property (assign) NSString *tempStr
:将没有释放/保留操作。这等于只更改一个指针。因此,执行此操作后,将不会释放yellowcolor,并且您将丢失对它的引用(如果您的代码中没有其他引用)。因此可能会导致内存泄漏。
@property (copy) NSString *tempStr
:类似于retain
,但它对新值调用copy
,而不仅仅是retain
,因此它将在内存中创建一个重复的对象。考虑到NSString,它等于retain
,因为NSString是不可变的,因此无需重复。
您可以在此处找到一些代码示例。
编辑:如@Bavarious所述,仅当用NSString
初始化此属性时,copy
才等于retain
。如果使用NSMutableString
初始化它,则将不相等,因为该变量是可变的,因此将复制\“ proper \”。
, 合成的二传手看起来像这样:
- (void)setSomeString:(NSString *)newString
{
if ([newString isEqualToString:someString]) return;
[someString autorelease];
someString = [newString copy]; // or [newString retain],depends how you defined the property ...
}
因此,当将新值分配给指针时,将释放旧值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。