-->

物业属性“保留”似乎并不奏效?(Property attribute “retain” doesn&

2019-09-21 19:13发布

我已经实现了一个位代码的许多苹果代码的例子之一,但我有一点麻烦,因为保留的属性之一的属性似乎并不奏效。 这里的财产申报:

@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释放。 我缺少的是在这里吗?

Answer 1:

当您引用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程序。



Answer 2:

你必须写self.editingViewController才能使用该属性。 只是“ editingViewController ”是类成员变量的直接访问,而self.editingViewController相当于[自我setEditingViewController:...],并做相应的保留/解除作业。



文章来源: Property attribute “retain” doesn't seem to be working?