我已经从众多 Apple 代码示例之一中实现了一些代码,但遇到了一些麻烦,因为其中一个属性的保留属性似乎不起作用。这是属性声明:
@property (nonatomic, retain) EditingViewController *editingViewController;
这是代码:
- (EditingViewController *)editingViewController {
// Instantiate the editing view controller if necessary.
if (editingViewController == nil) {
EditingViewController *aController = [[EditingViewController alloc] init];
editingViewController = aController;
[aController release];
}
return editingViewController;
}
我理解 (retain) 应该会导致分配时保留计数增加 1;但是,除非我自己做发送[aController keep],或者不发送[aController release],否则代码会失败。我在这里缺少什么?
最佳答案
当您引用 editingViewController
时,它相当于 self->editingViewController
,即访问 ivar。
如果您想使用 getter 或 setter,则需要使用 self.editingViewController
,或等效的 [self setEditingViewController:aController]
。
这就是为什么我更喜欢使用与属性名称不同的 ivar,例如:
EditingViewController* i_editingViewController;
@property (nonatomic, retain) EditingViewController *editingViewController;
@synthesize editingViewController = i_editingViewController;
然后你可以将惰性 getter 编写为:
- (EditingViewController *)editingViewController {
// Instantiate the editing view controller if necessary.
if (i_editingViewController == nil) {
i_editingViewController = [[EditingViewController alloc] init];
}
return i_editingViewController;
}
或
- (EditingViewController *)editingViewController {
// Instantiate the editing view controller if necessary.
if (i_editingViewController == nil) {
EditingViewController *aController = [[EditingViewController alloc] init];
self.editingViewController = aController;
[aController release];
}
return i_editingViewController;
}
我可能会使用前一种方法(不调用 setter ),因为 editingViewController
的值(如任何观察者所见)并没有真正改变,但无论哪种方式都应该可以正常工作并且名称不同(对于 ivar 和属性(property))有助于避免混淆或意外误用。这也是对使用该属性的温和鼓励(因为它避免了稍微难看的前缀)。
请注意,Apple 保留 _ 前缀,并且 setter 和 getter 不应在 init
/dealloc
例程中使用。
关于objective-c - 属性属性 "retain"似乎不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1215953/