【问题标题】:Should I use __unsafe_unretained for temp variables?我应该将 __unsafe_unretained 用于临时变量吗?
【发布时间】:2012-01-26 15:07:18
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 约书亚和佐尔所说的。额外保留/释放的影响对于您获得的问题预防来说是微不足道的。

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


【解决方案1】:

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

考虑:

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

【讨论】:

  • 仅出于性能原因。看起来编译器应该足够聪明,如果不需要的话,不会保留临时变量。
  • 它无法合理地知道。如果我没有直接将它设置为 nil ,而是调用了一些其他方法,该方法触发了一长串事件,导致 tableHeaderView 被释放,该怎么办?此外,您正在预优化。如果保留对象是您最关心的性能,那么您已经做了很多其他的事情。对象所有权不会成为您的瓶颈。
【解决方案2】:

马特,

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

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

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

安德鲁

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2015-01-08
      • 1970-01-01
      • 2020-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多