2009-08-16 97 views
9

有很多,其中一個將ALLOC一個實例,然後將其釋放它被分配到別的東西,它保留它在內部之後的案件。以後自動釋放或釋放是否更好?

例如,

 
UIView *view = [[UIView alloc] initWithFrame...]; 
[self addSubView:view]; 
[view release]; 

我聽到有人建議我們之後去自動釋放,而不是釋放。

所以上面就變成了:

 
UIView *view = [[[UIView alloc] initWithFrame...] autorelease]; 
[self addSubView:view]; 

這裏有什麼最好的做法是什麼?優點和缺點?

回答

14

在大多數情況下,它不會真的重要無論哪種方式。由於-autorelease僅表示該對象將在運行循環的當前迭代結束時釋放,因此該對象將以任一方式釋放。

使用-autorelease的最大好處是,你不必擔心對象在你的方法的情況下的壽命。所以,如果你以後決定,你想要做的事與物幾行後,這是最後一次使用,你不必擔心你的電話移到-release

使用-release時將作出顯着的差異與使用-autorelease主要例子是,如果你正在創建在你的方法臨時對象很多。例如,請考慮以下方法:

- (void)someMethod { 
    NSUInteger i = 0; 
    while (i < 100000) { 
     id tempObject = [[[SomeClass alloc] init] autorelease]; 

     // Do something with tempObject 

     i++; 
    } 
} 

通過這種方法結束的時候,你有10萬個對象坐在自動釋放池,等待被釋放。根據類的tempObject,這可能會或可能不會在桌面上的一個主要問題,但它肯定將是對內存受限的iPhone。因此,如果您要分配許多臨時對象,則應該使用-release而不是-autorelease。但是,對於許多/大多數用途,你不會看到兩者之間的任何主要區別。

+3

+1。 autorelease在性能方面受到很大的衝擊(flak我很少看到在正常的非大循環代碼中用數字備份),但autorelease在代碼重構時也可以節省大量的泄漏。我經常在低級例程中使用釋放,因爲我不知道它們是否可能在更高級別的大循環中調用。但是,如果你要使用release,那麼如果變量仍然在範圍內,你必須立即將該變量設置爲nil。永遠不要釋放一個對象,但仍然有一個指向它的指針。 – 2009-08-17 05:08:09

5

我同意Matt Ball。我只想補充一點,如果你發現自己經常使用這種模式,它可以很方便的編寫一個簡單的分類:

@interface UIView (MyCategories) 
- (UIView *)addNewSubviewOfType:(Class)viewType inFrame:(NSRect)frame; 
@end 

@implementation UIView (MyCategories) 
- (UIView *)addNewSubviewOfType:(Class)viewType inFrame:(NSRect)frame 
{ 
    UIView * newView = [[viewType alloc] initWithFrame:frame]; 
    [self addSubView:newView]; 
    return [newView autorelease]; 
} 
@end 

因而可作如下:

UIView * view = [someView addNewSubviewOfType:[UIView class] 
             inFrame:someFrame]; 

它甚至作品與其他類型的,只要它們是從UIView的衍生:

UIButton * button = [mainView addNewSubviewOfType:[UIButton class] 
              inFrame:buttonFrame]; 
4

我通常去 - 釋放,而不是-autorelease只要有可能。這來自多年的調試和增強其他人的Objective-C代碼的經驗。當一個對象被過度釋放時,使用autorelease的代碼在任何地方都會更難調試,因爲額外的發佈遠離不正確的代碼。

許多人在不瞭解可可內存管理如何工作時也會使用autorelease。學習規則,學習API,並且幾乎不需要自動釋放對象。

最後一個小問題是,如果你不需要autorelease行爲,那麼使用autorelease只是不必要地爲你的程序增加額外的工作。