繁体   English   中英

这个Objective-C代码是否会建立强大的参考周期?

[英]Does this objective-c code create a strong reference cycle?

我正在其他人的iOS项目中工作。 ARC(据我所知,一直都启用)。 该代码充满了按钮按下处理程序,这些处理程序创建了某个视图控制器的实例,将其委托设置为self,然后对其进行显示,例如,

- (IBAction)keyButton:(id)sender {
    MyViewController *controller = [[MyViewController alloc] init];
    controller.delegate = self;
    [self.navigationController pushViewController:controller animated:YES];
}

MyViewController显示了用于选择音乐键的旋转小部件。 选择后,用户会按回以使用选定的键来制作音乐。 这些是唯一的用户交互,并且没有后台进程等。

在MyViewController.h文件中,委托声明如下:

@interface MyViewController : UIViewController {
    id <ModuleUpdateDelegate> _delegate;
}

@property (nonatomic,strong) id delegate;

我有两个问题:

  1. 为什么原始作者每次按下按钮都会选择创建MyViewController的新实例?
  2. 谁拥有每个这样的实例? [何时]销毁? 由于它拥有对其委托人的强烈引用, 因此当前实现是否会(每次按下按钮时)创建一个强大的参照周期

我的本能是在委托中创建一个私有的MyViewController *属性,该属性仅在第一次按下按钮时加载。 然后,按照常规建议,我将使MyViewController中的委托属性变弱而不是变强。 但是就像我说的那样,当前的实现是相当普遍的,因此我很乐意更改任何东西而不先了解它是如何工作的。

任何帮助表示赞赏。

在这种情况下,谁保留MyViewController无关紧要,谁保留MyViewController的实例无关紧要。

在您发布的代码中,对MyViewController的强引用由self.navigationController 弹出MyViewController ,其保留计数将为0,然后将其释放。 只要controller.delegate不保留controller ,就没有周期。

就是说,您必须非常谨慎地使用强大的反向引用(例如,委托之类的东西)。 如有疑问,请使用仪器检查保留周期或内存泄漏。


我的建议:小心。 如果可能,将强代表变成弱代表。 即使目前没有保留周期,您也可以轻松创建一个而无需意识到。

按照惯例,委托引用比较弱。

通常,您创建一个对象,对其进行严格引用,然后将自己设置为它的委托。 (并且指向委托的指针很弱。)那种方式只有一种强引用。

在您的情况下,您的代码则相反。 在一个局部变量中创建对象(一个MyViewController),然后将其忘记。 MyViewController类的委托属性很强。 因此,没有对MyViewController对象的强引用,但对委托有强引用。

正如Jeffery所说,您现在似乎没有保留周期,但是如果稍后您决定需要保留指向MyViewController对象的指针,则可能会创建一个保留周期。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM