有很多关于 block 和保留循环的问题......他们引导我编写了以下代码:
- (void)promptNewName {
DTAlertView* prompt = [[DTAlertView alloc] initWithTitle: @"Name" message: @"foobar"];
prompt.alertViewStyle = UIAlertViewStylePlainTextInput;
[prompt addCancelButtonWithTitle: NSLocalizedString(@"Cancel",nil) block: ^{}];
__weak DTAlertView* weakPrompt = prompt; // need a weak reference to the prompt for the block
[prompt addButtonWithTitle: NSLocalizedString(@"Update",nil) block: ^{
self.valve.name = [weakPrompt textFieldAtIndex:0].text;}];
[prompt show];
}
我的问题是,有没有更好或更惯用的方法来做到这一点? DTAlertView
是 UIAlertView
的“ block 感知*”版本。但是,如果我必须做额外的工作才能使用 block ,似乎不太理想。
最佳答案
- 在我看来,一个好的第三方基于 block 的警报 View API 可能会采用警报 View 作为参数传递的 block ,因为原始的 UIAlertView 委托(delegate)方法会传递它们。如果它作为参数传递给 block ,那么在 block 内部,它可以只使用这个参数,而不是从外部捕获它。然而,看看source code
DTAlertView
的 block 不带任何参数。 - 如果 API 没有将警报 View 作为参数传递到 block 中,并且您发现由于某种原因需要访问该 block 本身中的警报 View ,那么是的,您将需要捕获弱引用到 block 中的警报 View 。否则,将会出现保留周期,因为:1)为了使警报 View 按钮正常工作,警报 View 必须保留该 block ,并且2)如果该 block 对警报 View 具有强引用,则会出现保留循环。
- 从某种意义上说,基于 block 的 API 比基于委托(delegate)的 API 为您提供了更大的灵活性,因为在基于 block 的 API 中,API 的用户可以决定您的 block 对每个事物是否具有强引用或弱引用如您认为合适;而在基于委托(delegate)的 API 中,API 决定委托(delegate)引用是弱还是强(通常是弱),用户无法控制它。
关于ios - 我真的必须创建变量的两个版本才能使用 Objective-C block 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20766396/