【问题标题】:Will this cause a retain cycle? (obj-c, sample code)这会导致保留周期吗? (obj-c,示例代码)
【发布时间】:2014-08-26 09:48:29
【问题描述】:
SomeViewController *newController = [SomeViewController new];
[newController setSomeBlock:^{
[self.someProperty doSomething];
}];
[self presentViewController:newController animated:YES completion:nil];
SomeViewController 具有someBlock 作为属性,父视图控制器self 呈现newController,而newController 的someBlock 正在访问父视图控制器的self.someProperty。
这会导致保留循环吗?
【问题讨论】:
标签:
ios
objective-c
memory-management
retain-cycle
【解决方案1】:
不,这不会创建保留周期,因为您使用 self 的块由 SomeViewController 保留,而不是 self/当前视图控制器类本身。
当您执行此代码时,someviewcontroller 的块将在其作用域内保留 self,当您弹出 someviewcontroller 或该块被释放时,它将释放 self。
仅当两个对象相互保留时才会引起保留循环,例如,在这种情况下:
SomeViewController *newController = [SomeViewController new];
[newController setSomeBlock:^{
[newController doSomething];
}];
[self presentViewController:newController animated:YES completion:nil];
您可以通过在 SomeViewController 和当前 View Controller 中的 dealloc 方法中添加 NSLog 语句来进一步验证这一点。
详情请参考Apple Docs