objective c setter方法内存管理

时间:2010-08-21 19:38:23

标签: objective-c

我对分配和释放对象有疑问:

如果我有这样的代码:

MyObject *object = [[MyObject alloc] init];
NSMutableString *string = [[NSMutableString alloc]initWithString:@"bla"];
object.myString = string;
NSLog(@"retain count: %d",[object.myString retainCount]); //gives me 2
[string release];
NSLog(@"retain count: %d",[object.myString retainCount]); //gives me 1

比我有我想要的。我只需要一个参考,我保留计数1

如果我使用

object.myString = [[NSMutableString alloc]initWithString:@"bla"];

我的财产看起来像这样:

@property (nonatomic,retain) NSMutableString *myString;

一个alloc,一个带有retain的setter方法给我保留计数2

如果我在重新调整后释放对象而不是应用程序崩溃。我不知道为什么?

那么,我是否必须始终使用临时引用创建一个对象,而不是分配给实际引用并像第一个代码一样释放临时引用?

还是有其他方法吗?

1 个答案:

答案 0 :(得分:1)

是和否。通常,这是一种常见的模式:

// create the object, retain count 1
MyObject *myObject = [[MyObject alloc] init];

// increment the retain count in the setter
self.myObjectProperty = myObject;

// let go of the object before the end of the current method
[myObject release];

您可以使用自动释放池来避免发布。更准确地说,您表明您希望尽快释放该对象:

MyObject *myObject = [[[MyObject alloc] init] autorelease];
self.myObjectProperty = myObject;

// all done!

对于许多Apple提供的类,您可以使用除alloc / init之外的类方法来获取已经自动释放的对象。您的示例可以重写为:

MyObject *myObject = [[MyObject alloc] init];
myObject.myString = [NSMutableString stringWithFormat:@"bla"];

最后一点:-retainCount是一个钝器。特别是对于NSStrings和其他内置类,它可能返回与您期望的结果完全不同的结果。一般来说你应该避免它。