如果属性的值被覆盖,会发生什么?

时间:2011-06-18 09:06:10

标签: objective-c memory-management nsstring properties

假设我创建了一个NSString类型的属性tempStr。 我明显合成了它。

在我的一个方法中,我将tempstr的值设置为yellowcolor。 然后就在那之后我用redcolor重新初始化了tempStr。

所以我想知道在这种情况下tempStr的内存会发生什么。

感谢名单。

2 个答案:

答案 0 :(得分:2)

这取决于您为自己的属性设置的属性:retainassigncopy

  • @property (retain) NSString *tempStr:将释放旧值(yellowcolor)并保留新值(redcolor)。唯一的例外是yellowcolor == redcolor。然后什么都不会发生,因为旧的和新的价值是相同的。
  • @property (assign) NSString *tempStr:没有释放/保留操作。它等于只改变一个指针。因此,在此操作之后,黄色将不会被释放,您将丢失对它的引用(如果您的代码中没有其他引用)。因此它可能导致内存泄漏。
  • @property (copy) NSString *tempStr:它与retain类似,但它在新值而不是copy上调用retain,因此它会在内存中创建一个重复的对象。考虑到NSS​​tring,它等于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 ...
}

因此,当将新值分配给指针时,将释放旧值。