假设我创建了一个NSString类型的属性tempStr。 我明显合成了它。
在我的一个方法中,我将tempstr的值设置为yellowcolor。 然后就在那之后我用redcolor重新初始化了tempStr。
所以我想知道在这种情况下tempStr的内存会发生什么。
感谢名单。
答案 0 :(得分:2)
这取决于您为自己的属性设置的属性:retain
,assign
或copy
。
@property (retain) NSString *tempStr
:将释放旧值(yellowcolor)并保留新值(redcolor)。唯一的例外是yellowcolor == redcolor
。然后什么都不会发生,因为旧的和新的价值是相同的。@property (assign) NSString *tempStr
:没有释放/保留操作。它等于只改变一个指针。因此,在此操作之后,黄色将不会被释放,您将丢失对它的引用(如果您的代码中没有其他引用)。因此它可能导致内存泄漏。@property (copy) NSString *tempStr
:它与retain
类似,但它在新值而不是copy
上调用retain
,因此它会在内存中创建一个重复的对象。考虑到NSString,它等于retain
,因为NSString是不可变的,所以不需要复制。您可以找到一些代码示例here。
编辑:正如@Bavarious提到的,copy
仅当您使用retain
初始化此属性时才等于NSString
。如果用NSMutableString
初始化它将不相等,因为这个是可变的,所以“正确”的副本将被制作。
答案 1 :(得分:1)
合成的setter看起来有点像这样:
- (void)setSomeString:(NSString *)newString
{
if ([newString isEqualToString:someString]) return;
[someString autorelease];
someString = [newString copy]; // or [newString retain], depends how you defined the property ...
}
因此,当将新值分配给指针时,将释放旧值。