我在别人的 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;
我有两个问题:
- 为什么原作者会选择在每次按下按钮时创建一个新的 MyViewController 实例?
- 谁拥有每个这样的实例?[什么时候]它会被摧毁?由于它拥有对其委托的强引用,当前的实现是否创建了一个强引用循环[每次按下按钮]?
我自己的直觉是在委托中创建一个私有的 MyViewController * 属性,该属性仅在第一次按下按钮时加载。然后,根据一般建议,我会将 MyViewController 中的委托属性设为弱而不是强。但就像我说的,当前的实现非常普遍,所以我对在不先了解它是如何工作的情况下改变任何东西持怀疑态度。
任何帮助表示赞赏。