我正在尝试将旧的非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]; }]; }
答案 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键以显示标志编辑框,将其添加到多个文件中。