2014-02-23 50 views
-2

我仍然圍繞着一些Objective-C,我想我已經開始掌握它了。我在玩一些對象數組,我試圖理解下面兩者之間的區別(arr和arr2)。這兩者有什麼區別?

他們似乎都做同樣的事情。如果他們確實有所不同,有人可以提供一些更有效的背景和例子,爲什麼?

NSDate *futureDate = [NSDate distantFuture]; 
NSDate *todaysDate = [NSDate date]; 

// what is the difference between these two? 
NSArray *arr = [[NSArray alloc] initWithObjects:todaysDate, @"Hello", @"World!", @1, @2, @3, @4, futureDate, nil]; 
NSArray *arr2 = [NSArray arrayWithObjects:todaysDate, @"Hello", @"World!", @1, @2, @3, @4, futureDate, nil]; 


for (id item in arr) 
    NSLog(@"%@", item); 

for (id item in arr2) 
    NSLog(@"%@", item); 
+0

更好,你應該先搜索谷歌,然後問這裏,檢查這個 - http://stackoverflow.com/questions/11537372/ios-difference-between-nsmutablearray-alloc-init-and-arraywithobjects –

+0

你會發現那裏大約有八種不同的方法來創建一個NSArray,並且在編寫程序時(或者當程序員開始使用Objective-C時),您幾乎可以約會該樣式。 '@ [todaysDate,@「Hello」,@「World!」,@ 1,@ 2,@ 3,@ 4,futureDate]'是現代化的方式。 –

+0

@HotLicks你確定嗎?當我嘗試用上面的for-in循環遍歷列表時,我得到了EXC_BAD_ACCESS。我把它歸爲:NSArray * arr = [NSArray arrayWithObjects:@ [todaysDate,@「Hello」,@「World!」,@ 1,@ 2,@ 3,@ 4,futureDate,pastDate]]; – Richard

回答

0

不同之處取決於您的內存管理。如果您使用的是ARC(最新版本中的默認值),則這兩者是等效的。

但是,如果您使用的是舊式手動管理,它們會有所不同:arr將保留計數爲1,因爲要明確調用-alloc。這意味着您擁有該物品,並在完成後負責致電-release。然而,arr2將會被'autoreleased',這意味着它不屬於NOT屬於你,你不負責釋放它。在這種情況下,它將在當前runloop結束時自動釋放。

+0

謝謝!自從我使用ARC以來,我也懷疑這一點。如果我不使用ARC,我發現手動需要發佈。我只想得到一個確定的答案。 – Richard