我已经实现了一个位代码的许多苹果代码的例子之一,但我有一点麻烦,因为保留的属性之一的属性似乎并不奏效。 这里的财产申报:
@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保留]自己,或不发[aController释放。 我缺少的是在这里吗?
当您引用editingViewController
,它相当于self->editingViewController
,即伊娃的访问。
如果你想使用一个getter和setter方法,你需要使用self.editingViewController
,或等价[self setEditingViewController:aController]
这就是为什么我更喜欢使用伊娃用不同的名称属性,例如:
EditingViewController* i_editingViewController;
@property (nonatomic, retain) EditingViewController *editingViewController;
@synthesize editingViewController = i_editingViewController;
然后,你可以写你的懒惰吸气剂:
- (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;
}
我可能会用前一种方法(不是调用设置),因为价值editingViewController
(任何观察者来看)并没有什么变化,但无论哪种方式应该正常工作和不同的名称(伊娃和财产)避免混乱或意外误用。 这也是一个温和的鼓励使用属性(因为它避免了略微丑陋前缀)。
需要注意的是苹果保留_前缀,而getter和setter方法不应该在使用init
/ dealloc
程序。
你必须写self.editingViewController
才能使用该属性。 只是“ editingViewController
”是类成员变量的直接访问,而self.editingViewController
相当于[自我setEditingViewController:...],并做相应的保留/解除作业。