我应该将__unsafe_unretained用于临时变量吗?

时间:2012-01-26 15:07:19

标签: objective-c automatic-ref-counting retaincount unsafe-unretained

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

  1. 指向另一个长寿命变量:

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

    __unsafe_unretained UIView *tableHeaderView = [[UIView alloc] init];
    
  3. 这些临时变量不需要保留,因为只要临时变量在范围内,它们指向的对象就可以保证保留正保留计数。那么,我应该将它们声明为__unsafe_unretained吗?

3 个答案:

答案 0 :(得分:5)

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

考虑:

__unsafe_unretained UIView *tableHeaderView = self.tableView.tableHeaderView
self.tableView.tableHeaderView = nil;
NSLog(@"%@", tableHeaderView); //<-I WILL CRASH

答案 1 :(得分:2)

马特,

ARC的重点是让你忽略这些问题。实际上,编译器甚至可能不会保留这些实例。

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

您应该只担心在循环中创建多余的对象并管理大对象的创建。前者通过明智地使用@autorelease来处理。你仍然像你做的那样管理大件物品。

安德鲁

答案 2 :(得分:1)

没有。如果ARC保留它,它将在变量超出范围时放开。