ios – 代表 – 保留或分配 – 发布?

前端之家收集整理的这篇文章主要介绍了ios – 代表 – 保留或分配 – 发布?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我看过一些与代表有关的帖子,我想知道参考它们的正确方法.假设我有一个声明如下的对象:
@interface MyViewController : UITableViewController {
    id delegate;    
}
@property (nonatomic,retain) id delegate;
@end

通过MyViewController的生命周期,它将调用其代理的方法以响应与用户的交互.

当它是时候摆脱MyViewController的一个实例时,是否需要在实现的dealloc方法中释放代理ivar,因为它被声明为retain?

或者反过来呢,是否应该授权呢?也许应该是@property(非原子,分配)id委托?根据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.

通常我只是去跟文档说的一样,但是我看到很多代码被保留在代理上.这只是“糟糕的代码”吗?我在这里推荐专家吗?处理这个问题的正确方法是什么?

解决方法

您通常希望分配代理而不是保留它们,以避免对象A保留对象B并且对象B保留对象A的循环保留计数.(您可能会看到这被称为保留代理的“弱引用”).例如,考虑以下常见模式:
-(void)someMethod {
    self.utilityObject = [[[Bar alloc] init] autorelease];
    self.utilityObject.delegate = self;
    [self.utilityObject doSomeWork];
}

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

有关更多信息,请参阅Why are Objective-C delegates usually given the property assign instead of retain?.

如果你分配代理而不是保留它,那么你不需要担心在dealloc中释放它.

原文链接:https://www.f2er.com/iOS/337056.html

猜你在找的iOS相关文章