ARC错误:无法捕获块中的__autoreleasing变量

时间:2014-02-11 20:24:05

标签: ios iphone automatic-ref-counting block autorelease

我正在尝试将旧的非ARC项目转换为ARC,并且我收到此编译错误: “无法在块中捕获__autoreleasing变量”

- (void)animateViewController:(__autoreleasing animatingViewController *)viewController 
{
   //[[viewController retain] autorelease]; // I replaced this with __autoreleasing

        [UIView animateWithDuration:0.14 animations:^{
            [[viewController view] setAlpha:0.0];
        } completion:^(BOOL finished) {
            [viewController.view removeFromSuperView];
        }];
}

3 个答案:

答案 0 :(得分:4)

当块捕获并保留viewController参数时,不必保留 - 自动释放对象。生命周期延长到动画结束,因为完成块保持在控制器上。

只需删除__autoreleasing说明符。

如果在另一种情况下,确实必须保留 - 自动释放实例,则可以将其分配给id __autoreleasing __attribute__((unused))局部变量。但这应该是一个非常罕见的情况,可能是您设计中存在缺陷的迹象。

答案 1 :(得分:1)

__autoreleasing几乎从未使用过。 __autoreleasing主要仅在“__autoreleasing指针”中很重要,即id __autoreleasing *NSString * __autoreleasing *。在这种情况下,它与“指向__strong”的指针不同,即id *

在您的情况下,您直接拥有__autoreleasing局部变量。这超过__strong没有任何好处(如果你没有放置任何限定符,它隐含__strong),实际上更糟。 __strong会根据需要正确保留和释放;如果没有必要,不需要使用自动释放。

答案 2 :(得分:0)

通过为这些文件添加-fno-objc-arc编译器标志,可以为单个文件禁用ARC。

您在目标中添加编译器标志 - >构建阶段 - >编译源代码。您必须双击Compiler Flags下行的右列。您还可以通过按住cmd按钮选择文件,然后按Enter键以显示标志编辑框,将其添加到多个文件中。