ios - 我真的必须创建变量的两个版本才能使用 Objective-C block 吗?

标签 ios objective-c ios7 objective-c-blocks

有很多关于 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];
}

我的问题是,有没有更好或更惯用的方法来做到这一点? DTAlertViewUIAlertView 的“ 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/

相关文章:

ios - Alamofire 中 AFJSONRequestSerializer 的对应物是什么?

android - 适用于 Unity3d Windows 应用程序的 Firebase

objective-c - 重新加载 UIModalViewControllers

iphone - 验证我的 iPhone 应用程序

iOS 动画 UITabBarController 滑动; View 重叠状态栏 - 仅在第一次加载时

iOS 共享扩展 - 如何访问核心数据

ios - PHPhotoLibrary 获取相册名称

objective-c - 有没有办法更快地发现 BLE 外设服务?

ios - XCode 5.1 Beta 4无法识别iOS 7.1 Beta 4测试设备

iOS7 侧边菜单状态栏颜色过渡。如在 iOS7 Facebook 应用程序中