Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 我真的必须创建两个版本的变量才能使用objective-c块吗?_Ios_Objective C_Ios7_Objective C Blocks - Fatal编程技术网

Ios 我真的必须创建两个版本的变量才能使用objective-c块吗?

Ios 我真的必须创建两个版本的变量才能使用objective-c块吗?,ios,objective-c,ios7,objective-c-blocks,Ios,Objective C,Ios7,Objective C Blocks,关于块和保留周期有很多问题。。。他们引导我将以下代码组合在一起: - (void)promptNewName { DTAlertView* prompt = [[DTAlertView alloc] initWithTitle: @"Name" message: @"foobar"]; prompt.alertViewStyle = UIAlertViewStylePlainTextInput; [prompt addCancelButtonWithTitle: NSLo

关于块和保留周期有很多问题。。。他们引导我将以下代码组合在一起:

- (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的一个“块感知*版本”。但是如果我必须做额外的工作来使用这些块,它似乎就不那么理想了。

  • 在我看来,一个好的基于块的第三方警报视图API可能会将警报视图作为参数传递的块作为参数,因为原始UIAlertView委托方法会传递它们。如果它作为参数传递给块,那么在块内部,它可以只使用此参数,而不是从外部捕获它。但是,查看
    DTAlertView
    ,其块不带任何参数
  • 如果API未将警报视图作为参数传递到块中,并且您发现出于某种原因需要访问该块中的警报视图本身,则是的,您将需要捕获对块中警报视图的弱引用。否则,将有一个保留周期,因为:1)为了警报视图按钮能够正常工作,警报视图必须保留该块,2)如果该块对警报视图有强引用,则将有一个保留循环
  • 从某种意义上说,基于块的API比基于委托的API更具灵活性,因为在基于块的API中,API的用户可以根据自己的喜好决定块对每个事物的引用是强引用还是弱引用;而在基于委托的API中,API决定委托引用是弱引用还是强引用(通常是弱引用),而用户不控制它

在不了解
DTAlertView
的内部结构的情况下,您似乎需要在块中使用弱引用,因为它可能会将块保留在iVar中,从而创建一个保留周期。没有“额外工作”“在这儿。相反,这样做很好的原因是,您可以在一个块中,而不是在一个或多个单独的委托方法中表达您希望在解聘时完成的操作。@matt,当然还有额外的工作,这就是您需要创建
weakPrompt
(这看起来很小,但在编写的每一个区块代码中都需要仔细考虑)。这是块如何实现的一个不幸的副作用。它本可以以不同的方式实现,但事实就是如此。也许这是最好的方式,但C++的lambdas做得不同,所以这肯定不是唯一的方式。但是,考虑到它的方式,没有一种真正好的方式来声明和使用weakPrompt。请参见答案by@newacct-他们在第一个项目中提出了一个非常好的观点。除了
DTAlertView
,你可能会得到更好的服务吗?回答得很好。有人向我推荐了CoCoanatics DT的东西,我会四处看看。作为一个以前的Smalltalk人,我发现我很高兴ObjC有块,但对它们的细微差别感到失望。在Smalltalk的世界中,我们会用提示符清除块。。但是需要在ObjC上键入块签名,这让人很不舒服。如果DTAlertView按照您的建议设计,我认为它只是在推丑。然后我会从简单的
^{…;}
^(DTAlertView*提示符){…;}