属性属性“保留”似乎不起作用?

时间:2009-08-01 06:13:49

标签: objective-c iphone memory-management properties retain

我已经从许多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]。我在这里缺少什么?

2 个答案:

答案 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:...]并且将执行相应的保留/释放作业。