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

标签 objective-c iphone memory-management properties retain

我已经从众多 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/

相关文章:

ios - 后台联网进程

iphone - CoreText 页面 View 示例 (CTPageViewer)

iphone - 清除数据源对象后刷新 TableView

opencv - cv::Ptr<CvHaarClassifierCascade> 是如何被释放的?

ios - 通过使用 JSON 的 POST 从 NSURLSession 取回数据

objective-c - 如果 url 存在 Objective-c

iphone - 关于流体布局的问题

objective-c - 创建缩略图库的最佳方式

c - C中的堆栈分配

ios - UIButton 在 vi​​ewDidLoad 中为 null