gpt4 book ai didi

ios - 代表 - 保留或分配 - 释放?

转载 作者:技术小花猫 更新时间:2023-10-29 10:22:09 27 4
gpt4 key购买 nike

我看过很多与委托(delegate)相关的帖子,我想知道引用它们的正确方法。假设我有一个声明如下的对象:

@interface MyViewController : UITableViewController {
id delegate;
}
@property (nonatomic, retain) id delegate;
@end

贯穿MyViewController的生命周期,它将调用其委托(delegate)的方法以响应与用户的交互。

何时需要删除 MyViewController 的实例? , delegate ivar 需要是 release 'ed 在实现的 dealloc 中方法,因为它是用 retain 声明的?

或者相反,应该delegate甚至被保留?也许应该是@property (nonatomic, assign) id delegate ?根据Apple's docs :

retain ... You typically use this attribute for scalar types such as NSInteger and CGRect, or (in a reference-counted environment) for objects you don’t own such as delegates.

通常我会按照文档所说的去做,但我已经看到很多调用 retain 的代码。在委托(delegate)上。这只是“错误代码”吗?我尊重这里的专家......处理这个问题的正确方法是什么?

最佳答案

您通常希望分配委托(delegate)而不是保留它们,以避免在对象 A 保留对象 B 而对象 B 保留对象 A 的情况下循环保留计数。(您可能会看到这被称为保持对委托(delegate)。)例如,考虑以下常见模式:

-(void)someMethod {
self.utilityObject = [[[Bar alloc] init] autorelease];
self.utilityObject.delegate = self;
[self.utilityObject doSomeWork];
}

如果 utilityObjectdelegate 属性都使用 retain 声明,那么 self 现在会保留 self.utilityObjectself.utilityObject 保留self

参见 Why are Objective-C delegates usually given the property assign instead of retain?有关更多信息。

如果您分配委托(delegate)而不是保留它,那么您无需担心在 dealloc 中释放它。

关于ios - 代表 - 保留或分配 - 释放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4795871/

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