2009-07-17 40 views
0

我想通過Obj-C摸索我的方式來構建一款iPhone遊戲。insertObject不添加對象?

我想構建一個對象數組供以後使用。下面是我的嘗試:

NSMutableArray  *positionIcons; 
[positionIcons insertObject:annotation atIndex:0]; 
positionIcons = [NSArray arrayWithObjects:annotation, nil]; 

的insertObject線離開計數爲0。但是,下一行正確插入對象(和計數移至1)。是什麼賦予了?

回答

7

需要初始化positionIcons,代碼更改爲:

NSMutableArray *positionIcons = [[NSMutableArray alloc] init]; 
[positionIcons insertObject:annotation atIndex:0]; 
positionIcons = [NSArray arrayWithObjects:annotation, nil]; 
+0

哇 - 快速和完美。我一直在撕掉我的頭髮。 – BankStrong 2009-07-17 15:36:02

4

@msaeed有正確的答案,但它是值得考慮多一點時間上的代碼片段,因爲它出現內存泄漏。

The iPhone doesn't support garbage collection,因此瞭解Objective-C的半自動內存管理是如何工作是很重要的。 Apple has a good reference here,但其要點在於您負責維護對象的「保留計數」。當使用-init實例方法初始化對象時(例如在您的示例中爲[[NSMutableArray alloc] init],但也包括以「init」開頭的任何其他方法(如[[NSMutableArray alloc] initWithCapacity:42]),則新初始化對象的保留計數爲1.隨後調用該實例的-retain方法增加保留計數,同時調用實例的-release方法減少計數值,當計數值達到0時,釋放該對象,並進一步嘗試發送它的消息將導致空指針例外

在@ msaeed的更正的代碼,這裏是發生了什麼,按行:

  1. 的新實例被分配;調用-init方法,該方法初始化實例並將保留計數設置爲1.然後將positionIcons指針設置爲此新實例的地址。
  2. positionIcons上調用-insertObject:atIndex:方法,並且一切都很好(同樣,按照約定將對象添加到集合中,例如增加該對象的保留計數,該集合現在具有某種意義上的「所有權」該對象,並且不希望它從其下面被釋放)。
  3. 分配NSArray的新實例,然後positionIcons指針被設置爲該新實例的地址。因爲第一行的NSMutableArray的保留計數仍然爲1,所以它不會被釋放,並且由於您已經失去了對它的引用,所以您永遠無法調用-release將其清除內存。有你的泄漏。

按照慣例,有一個在你如何管理與-init實例方法與類的方法,如+arrayWithObjects:(在第一種情況下初始化的對象的不同,你必須自己釋放對象,而在第二種情況下,對象已經發送了一條-autorelease消息,並且將在下一次通過程序的runloop時釋放它,除非您致電-retain

+0

謝謝 - 內存泄漏問題在我的代碼中(我確信msaeed不想通過同時修復來混淆) 當我學習obj-C時,我故意泄漏內存。我有更多的知識後,我打算回到自己身後。你的例子對此很有幫助。 – BankStrong 2009-07-20 12:04:48