Objective c 如果某个属性的值被覆盖,该属性会发生什么情况?

Objective c 如果某个属性的值被覆盖,该属性会发生什么情况?,objective-c,memory-management,nsstring,properties,Objective C,Memory Management,Nsstring,Properties,假设我创建了一个NSString类型的属性tempStr。 显然是我合成的 在我的一个方法中,我将tempstr的值设置为yellowcolor。 然后就在那之后,我用redcolor重新初始化了tempStr 所以我想知道在这种情况下tempStr的内存会发生什么变化 Thanx.合成setter看起来有点像这样: - (void)setSomeString:(NSString *)newString { if ([newString isEqualToString:someString

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

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

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


Thanx.

合成setter看起来有点像这样:

- (void)setSomeString:(NSString *)newString
{
   if ([newString isEqualToString:someString]) return;

   [someString autorelease];
   someString = [newString copy]; // or [newString retain], depends how you defined the property ...
}

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

这取决于您为属性设置的属性:
retain
assign
copy

  • @property(retain)NSString*tempStr
    :旧值(黄色)将被释放,新值(红色)将被保留。唯一的例外是
    yellowcolor==redcolor
    时。然后什么也不会发生,因为旧的和新的价值观是相同的
  • @property(assign)NSString*tempStr
    :不会有释放/保留操作。这相当于只更改一个指针。因此,在此操作之后,yellowcolor将不会被释放,并且您将丢失对它的引用(如果代码中没有对它的其他引用)。因此,它可能会导致内存泄漏
  • @property(copy)NSString*tempStr
    :它类似于
    retain
    ,但它在新值上调用
    copy
    ,而不仅仅是
    retain
    ,因此它会在内存中创建一个重复的对象。考虑到NSString,它等于
    retain
    ,因为NSString是不可变的,所以不需要复制
您可以找到一些代码示例


编辑:如@bavaried所述,
copy
仅当您使用
NSString
初始化此属性时,才等于
retain
。如果您使用
NSMutableString
初始化它,它将不相等,因为这一个是可变的,因此将生成“正确的”副本。

请注意,
NSString
属性可以指定为
NSMutableString
对象,在这种情况下,
copy
不会充当
retain