3

比方说,我想创建一个临时变量,例如:我应该使用__unsafe_unretained作为临时变量吗?

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

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

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

这些临时变量不需要保留,因为它们指向的对象都保持积极的保留计数,只要临时变量都在范围之内。那么,我应该宣布他们为__unsafe_unretained

+1

Joshua和zoul说了什么。额外保留/释放的影响对于您获得的问题预防来说并不重要。 – Wevah

回答

1

否。如果ARC保留它,当变量超出范围时它将放开。

5

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

考虑:

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

仅出于性能原因。看起来编译器应该足够聪明,如果不需要保留临时变量。 – ma11hew28

+2

虽然它不能合理地知道。如果不是直接在那里设置它,我调用了一些其他方法触发了一系列导致tableHeaderView被释放的事件。此外,你正在优化。如果物体的保留是您对性能的首要关注,那么您已经完成了大量的其他工作。对象所有权不会成为你的瓶颈。 –

2

马特,

ARC的全部意义就是让你忽略了这类问题。事实上,编译器甚至可能不保留这些实例。

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

你应该只关心循环中多余的对象创建以及管理大对象的创建。前者通过审慎使用@autorelease来处理。您仍然像管理ARC一样管理大型项目。

Andrew

相关问题