2015-08-15 15 views
5
  1. 有三種模式來創建數組變量的存儲器管理:文本語法

    • NSArray *array = @[@0, @1];

    • NSArray *array = [NSArray arrayWithObjects:@0, @1, nil];

    • NSArray *array = [[NSArray alloc] initWithObjects:@0, @1, nil];

  2. 當我使用第二種模式創建時,varialbe「數組」將被拋出到autoreleasepool; 當我使用第三個時,var的retainCount將是1,但不會被拋出到autoreleasepool; 我想知道第一種模式與第二種模式或第三種模式有相同的效果;

+0

有義務www.whentouseretaincount.com。 :) – bbum

回答

2

一般的規則是,如果你不調用一個方法開始「黃金」或「新」或含有「複製」,那麼你不擁有這個對象,也沒有權利也沒有責任釋放它。雖然,當然,如果你明確地保留一個對象,那麼你不得不平衡它與一個版本(或autorelease,這只是另一種安排釋放它的方式)。

不要試圖推斷哪些對象可能會或可能不會在autorelease池中。另外,不要試圖推斷保留計數。只關心自己的所有權和責任。

+0

同樣重要的是要注意,在ARC中,autorelease的很多例子都被優化了,所以關於autoreleasepool的推理更加困難且毫無結果。 –

+0

雖然這個答案有很好的信息,但它並沒有真正回答這個問題。像#2或#3一樣是#1嗎? – rmaddy

+0

@rmaddy,我認爲它很好。 #1不涉及調用以「alloc」或「new」開始或包含「copy」的方法。 #2也不涉及這一點。 #3的確如此。那麼,我不能依賴讀者從中得出結論嗎? –

3

第一和第二模式的結果是相同的。 第一種模式是第二

來源的便利語法:Objective-C Literals

+6

不完全正確:文字擴展爲'+ [NSArray arrayWithObjects:count:]'。但就autorelease而言,結果與您所說的相同。 –

1

始終將保留計數視爲增量。所以:

1. NSArray *array = @[@0, @1]; 

array具有+0保留計數(即它保留並自動釋放上創建基本上是無能爲力的,事實上,它可能無法都得到了保留,並自動釋放所有 - NSString *foo = @"foo";已完全相同的+0語義,但實現細節不是保留/ autorelease)。

2. NSArray *array = [NSArray arrayWithObjects:@0, @1, nil]; 

與(1)相同,只是更多的手指鍛鍊。

NSArray *array = [[NSArray alloc] initWithObjects:@0, @1, nil]; 

array+1保留計數至於你所關注。您需要知道的唯一細節是,爲了您的代碼的責任array被放棄,該對象必須是release d或autorelease d。無論它是用+1保留計數創建的......是否有內部保留計數爲42 ...是否保留了5次並自動釋放了4 ....都與您的代碼完全無關。

1

除了內存分配的細節,有

NSArray* array = @[obj1, obj2, obj3]; 

NSArray* array = [NSArray arrayWithObjects: obj1, obj2, obj3, nil]; 

之間的一個很大的區別的第二個將在第一個零爭論停止。你期待一個包含三個元素的數組,但是如果obj1!= nil和obj2 == nil,那麼結果是一個包含一個元素的數組。如果obj1,obj2或obj3中的任何一個爲零,則第一個拋出異常。