2009-11-16 51 views
2

我在initialisations以下兩種方式有點困惑的最佳方式.....建議陣列(或其他對象)的初始化

方法1:

- (void) myMethod{ 

    NSArray *myArray = [[NSArray alloc] initWithObjects:obj1,obj1,nil]; 
    [self setClassArray:myArray]; 
    [myArray release]; 
} 

方式二:

- (void) myMethod{ 

NSArray *myArray = [NSArray arrayWithObjects:obj1,obj2,nil]; 
[self setClassArray:myArray]; 
} 

在方式1中,我使用的alloc一個init方法這是一種實例方法和如我已經使用了的alloc語句我不得不釋放陣列自己。

在方法2中,我使用了靜態方法來初始化數組,因爲沒有使用alloc語句,所以我不需要釋放內存,系統將處理該內存。

方式1,是耗時的,如果不照顧

路2可以導致內存泄漏,在寫作速度更快,你不需要採取的內存照顧泄漏

但是,我仍然已經比標準方法更經常地看到標準源代碼使用的方式2。我不知道人們爲什麼這樣做,或者我在某個地方是否有錯。

答覆和評論是oppenly邀請。請建議最佳編程習慣。

回答

5

你的第二個例子使用了一個便利的構造函數,它返回一個自動釋放對象。那麼問題是,使用autorelease還是alloc/release會更好。 mmalcanswer on this StackOverflow thread解釋了autoreleasing對象的缺點。 (基本上,使用alloc/release只要有可能。)

而且(這可能說明明顯),有些類可能沒有方便的構造,所以這些工作時,你不得不使用alloc/release

1

我所知,

[NSArray arrayWithObjects:obj1,obj2,nil]; 

返回一個自動釋放的對象,像水木清華

[[[NSArray alloc] initWithObjects:obj1,obj1,nil] autorelease]; 

,我不喜歡用自動釋放池管理內存。也許這只是一種偏見))

0

我通常更喜歡第二種方式,如果我正確地記得,這也是Apple文檔所推薦的(儘可能使用autorelease)。

在方式1中,內存得到釋放更快,所以如果你有一個方法被循環調用或遞歸調用,使用autorelease可能會累積很多內存,而alloc/retain會使內存佔用降低。

另一方面,我認爲使用autorelease更有效率,因爲autorelease池可以一次釋放大塊內存,而不是一次又一次地釋放小塊。堅強我可能在這裏是錯的。

1

使用方法2(autorelease)時,如果操作系統感覺沒有引用,則釋放該對象。 但是,當您使用手動版本時,當您輸入代碼時,您可以直接發佈,或者在需要時發佈。