【问题标题】:What happens to a property if its value is overwritten?如果属性的值被覆盖,会发生什么情况?
【发布时间】:2011-09-17 16:59:56
【问题描述】:

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

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

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

谢谢。

【问题讨论】:

    标签: objective-c memory-management nsstring properties


    【解决方案1】:

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

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

    您可以找到一些代码示例here

    编辑:正如@Bavarious 提到的,copy 仅当您使用NSString 初始化此属性时才等于retain。如果你用NSMutableString 初始化它就不会相等,因为这个是可变的,所以会制作“正确”的副本。

    【讨论】:

    • 请注意,NSString 属性可以指定为 NSMutableString 对象,在这种情况下,copy 不会充当 retain
    【解决方案2】:

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

    - (void)setSomeString:(NSString *)newString
    {
       if ([newString isEqualToString:someString]) return;
    
       [someString autorelease];
       someString = [newString copy]; // or [newString retain], depends how you defined the property ...
    }
    

    所以当新值赋给指针时旧值被释放。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-05
      • 1970-01-01
      • 2015-01-15
      • 1970-01-01
      相关资源
      最近更新 更多