Objective-C:自动释放初始化后是否在构造函数中保留了错误?

时间:2009-09-16 14:29:17

标签: iphone objective-c constructor initialization

在我的@interface theres a NSArray *Monate后跟:

@property (nonatomic, retain) NSArray* Monate;

如果我这样做:

filePath = [[NSBundle mainBundle] pathForResource:@"SomeFile" ofType:@"plist"];
self.Monate = [NSArray  arrayWithContentsOfFile:filePath];

在构造函数中,它被设置为一个自动释放的对象(这是正确的吗?)。 那么我之后应该[Monate retain]吗?

3 个答案:

答案 0 :(得分:4)

这段代码是正确的;你不应该添加一个保留电话。

+[NSArray arrayWithContentsOfFile:]将返回自动释放的NSArray。将其传递给-[YourClass setMonate:]将保留对象并分配给支持ivar。构造函数返回后,新的NSArray将保留计数为2,并将其添加到当前自动释放池中(导致净保留计数为1)

只要在dealloc中释放数组,此代码就是正确的。

答案 1 :(得分:2)

之后你不应该保留。通过设置保留的@property,当您使用self.Monate setter

时会发生一些特殊情况

1)Monate实例变量中的任何内容(如果有)都将获得释放 2)新的任务将获得保留。

如果你使用了@property of assign,那么你必须保留,但是你的方式很好。

作为旁注,在objective-c中,大写单词通常保留给类名。我建议将它改为“monate”而不是“Monate”,因为这可能导致路上的混乱

答案 2 :(得分:0)

[NSArray arrayWithContentsOfFile:];返回一个自动释放的数组,如果你希望它比方法结束的时间更长,它将需要保留。

请注意您的财产声明如何指定“保留”。这意味着任何self.property = x;你做的电话将保留你传递的对象。

所以你在做什么是正确的。只记得做self.property = nil;在你的dealloc方法中。

将属性设置为nil将释放旧对象并将指针设置为nil,这是正确的方法。