2

我已经从许多 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 retain] 或发送 [aController release],否则代码会失败。我在这里想念什么?

4

2 回答 2

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;

然后你可以把你的惰性吸气剂写成:

- (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。

于 2009-08-01T06:33:12.480 回答
0

您必须编写self.editingViewController才能使用该属性。只是“ editingViewController”是对 Class 成员变量的直接访问,而self.editingViewController等效于 [self setEditingViewController:...] 并将执行适当的保留/释放工作。

于 2009-08-01T06:17:27.470 回答