gpt4 book ai didi

objective-c - 属性属性 "retain"似乎不起作用?

转载 作者:行者123 更新时间:2023-12-03 20:50:14 25 4
gpt4 key购买 nike

我已经从众多 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 keep],或者发送[aController release],否则代码会失败。我在这里缺少什么?

最佳答案

当您引用 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 和属性(property))有助于避免混淆或意外误用。这也是对使用该属性的温和鼓励(因为它避免了稍微难看的前缀)。

请注意,Apple 保留 _ 前缀,并且 setter 和 getter 不应在 init/dealloc 例程中使用。

关于objective-c - 属性属性 "retain"似乎不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1215953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com