3

假设我想创建一个临时变量,例如:

  1. 指向另一个长期存在的变量:

    __unsafe_unretained UIView *tableHeaderView = self.tableView.tableHeaderView;
    
  2. 指向我刚刚创建的对象。

    __unsafe_unretained UIView *tableHeaderView = [[UIView alloc] init];
    

这些临时变量不需要保留,因为只要临时变量在范围内,就可以保证它们指向的对象保持正保留计数。那么,我应该将它们声明为__unsafe_unretained吗?

4

3 回答 3

5

为什么系统保留您的临时变量很重要?事实上,你确实想保留它。

考虑:

__unsafe_unretained UIView *tableHeaderView = self.tableView.tableHeaderView
self.tableView.tableHeaderView = nil;
NSLog(@"%@", tableHeaderView); //<-I WILL CRASH
于 2012-01-26T15:09:25.957 回答
2

马特,

ARC 的全部意义在于让您忽略这些问题。事实上,编译器甚至可能不会保留这些实例。

让ARC担心这些问题。在编译器或静态分析器抱怨之前,不要试图帮助它。(顺便说一句,您让分析器在每次编译时都运行,对吗?它会在您创建问题时发现问题。)

您应该只担心循环中过多的对象创建和管理大型对象的创建。前者是通过明智地使用来处理的@autorelease。您仍然像 ante-ARC 一样管理大型项目。

安德鲁

于 2012-01-27T14:47:39.443 回答
1

不。如果 ARC 保留它,它会在变量超出范围时释放。

于 2012-01-26T15:09:23.480 回答