[英]Objective-C: Is an autoreleased initialisation followed by a retain wrong in a constructor?
在我的@interface
有一个NSArray *Monate
其后是:
@property (nonatomic, retain) NSArray* Monate;
如果我做:
filePath = [[NSBundle mainBundle] pathForResource:@"SomeFile" ofType:@"plist"];
self.Monate = [NSArray arrayWithContentsOfFile:filePath];
在构造函数中,将其设置为自动释放的对象(对吗?)。 那之后我应该做[Monate retain]
吗?
该代码是正确的; 您不应该添加保留呼叫。
+[NSArray arrayWithContentsOfFile:]
将返回自动释放的NSArray
。 将其传递给-[YourClass setMonate:]
将保留该对象并分配给后备ivar。 构造函数返回后,新的NSArray
的保留计数为2,并一次添加到当前自动释放池中(净保留计数为1)
只要您在dealloc中释放该数组,此代码就是正确的。
之后您不应该保留。 通过设置保留的@property,当您使用self.Monate setter时会发生一些特殊的事情
1)Monate实例变量中的任何内容(如果有)将得到释放。
2)新的任务将被保留。
如果您要使用@property的assign,那么您将必须保留,但您的状况会很好。
附带说明,在目标c中,大写单词通常保留用于类名称。 我建议将其更改为“ monate”而不是“ Monate”,因为这可能会导致混乱
[NSArray arrayWithContentsOfFile:]; 返回一个自动释放的数组,如果您希望它比方法结尾更长的时间,则需要保留该数组。
注意您的属性声明如何指定“保留”。 这意味着任何self.property = x; 您执行的呼叫将保留您传递的对象。
因此,您在那做的是正确的。 只记得做self.property = nil; 在您的dealloc方法中。
将属性设置为nil将释放旧对象,并将指针设置为nil,这是正确的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.