我对分配和释放对象有疑问:
如果我有这样的代码:
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
如果我在重新调整后释放对象而不是应用程序崩溃。我不知道为什么?
那么,我是否必须始终使用临时引用创建一个对象,而不是分配给实际引用并像第一个代码一样释放临时引用?
还是有其他方法吗?
答案 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和其他内置类,它可能返回与您期望的结果完全不同的结果。一般来说你应该避免它。