我已经从许多Apple代码示例中的一个实现了一些代码,但是我遇到了一些麻烦,因为其中一个属性的retain属性似乎不起作用。这是财产声明:
@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;
}
我知道(保留)应该导致保留计数在分配时增加1;但是,代码失败,除非我执行自己发送[aController retain],或者不发送[aController release]。我在这里缺少什么?
答案 0 :(得分:4)
当您引用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)和财产)帮助避免混淆或意外误用。使用该属性也是一种温和的鼓励(因为它避免了稍微丑陋的前缀)。
请注意,Apple保留_前缀,并且不应在init
/ dealloc
例程中使用setter和getter。
答案 1 :(得分:0)
您必须编写self.editingViewController
才能使用该属性。只是“editingViewController
”是对Class成员变量的直接访问,而self.editingViewController
等同于[self setEditingViewController:...]并且将执行相应的保留/释放作业。