问题描述
|
假设我创建了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 ...
}
因此,当将新值分配给指针时,将释放旧值。