【发布时间】:2011-09-17 16:59:56
【问题描述】:
假设我创建了一个 NSString 类型的属性 tempStr。 明明是我合成的。
在我的一种方法中,我将 tempstr 的值设置为黄色。 然后就在这之后,我用 redcolor 重新初始化了 tempStr。
所以我想知道在这种情况下 tempStr 的内存会发生什么。
谢谢。
【问题讨论】:
标签: objective-c memory-management nsstring properties
假设我创建了一个 NSString 类型的属性 tempStr。 明明是我合成的。
在我的一种方法中,我将 tempstr 的值设置为黄色。 然后就在这之后,我用 redcolor 重新初始化了 tempStr。
所以我想知道在这种情况下 tempStr 的内存会发生什么。
谢谢。
【问题讨论】:
标签: objective-c memory-management nsstring properties
这取决于您为属性设置的属性:retain、assign 或 copy。
@property (retain) NSString *tempStr:旧值(黄色)将被释放,新值(红色)将被保留。唯一的例外是yellowcolor == redcolor。然后什么都不会发生,因为旧值和新值是相同的。@property (assign) NSString *tempStr:不会有释放/保留操作。这等于只更改一个指针。因此,在此操作之后,黄色将不会被释放,并且您将丢失对它的引用(如果您的代码中没有其他对它的引用)。所以它可能会导致内存泄漏。@property (copy) NSString *tempStr:它类似于retain,但它在新值上调用copy 而不仅仅是retain,所以它会在内存中创建一个重复的对象。考虑到NSString,就等于retain,因为NSString是不可变的,所以不需要重复。您可以找到一些代码示例here。
编辑:正如@Bavarious 提到的,copy 仅当您使用NSString 初始化此属性时才等于retain。如果你用NSMutableString 初始化它就不会相等,因为这个是可变的,所以会制作“正确”的副本。
【讨论】:
NSString 属性可以指定为 NSMutableString 对象,在这种情况下,copy 不会充当 retain。
合成的 setter 看起来有点像这样:
- (void)setSomeString:(NSString *)newString
{
if ([newString isEqualToString:someString]) return;
[someString autorelease];
someString = [newString copy]; // or [newString retain], depends how you defined the property ...
}
所以当新值赋给指针时旧值被释放。
【讨论】: