2010-06-13 74 views
0

我在頭文件中聲明的的NSMutableArray:在其他函數中保留count = 0?內存管理問題?

NSMutableArray *myMuArr; 

@property (nonatomic, retain) NSMutableArray *myMuArr; 

在.m文件我有一個代表從其他類:

-(void)didGrabData:(NSArray*)theArray { 
self.myMuArr = [[[NSMutableArray alloc] initWithArray:myMuArr]retain]; 
} 

如果我想訪問cellForRowAtIndexPath中的self.myMuArr,它是空的(我檢查了數組的保留數,它是0)

我在做什麼錯?

當然,它在dealloc中發佈,沒有其他地方。

我將是任何幫助非常心存感激:0)

+0

保留計數不會是0,應該是3,但我敢打賭,你去查看[計數](http://developer.apple.com/iphone/庫/文檔/ Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.html#// apple_ref/occ/instm/NSArray/count)這是數組中對象的數量,它是0.不同於保持計數。 – progrmr 2010-06-13 22:22:18

回答

1

我想你不明白時,可以保留和釋放。看看this SO question and answer。閱讀並理解它,閱讀它鏈接的文章。它會幫助你很多。在iPhone上了解這一點至關重要。 (1)當你調用alloc/init時,你得到一個你擁有的數組(它被保留下來)。當你調用alloc/init時,你會得到一個數組。 (2)當你呼叫保留時,這是一個額外的保留。 (3)您的setter self.myMuArr被定義爲保留在@property中,因此當您使用setter方法分配指針時,它將被再次保留。

您通常看到的代碼中使用這兩種技術,這兩種都是正確的:

-(void)didGrabData:(NSArray*)theArray { 
    NSMutableArray *arr = [[NSMutableArray alloc] initWithObjects:obj1, obj2, nil]; 
    self.myMutArr = arr; 
    [arr release];  
} 

或者使用arrayWithObjects,它給你,你需要保留,如果你想利用它的內存空間的所有權一個autoreleased數組和保持它。您的setter方法做到這一點:

-(void)didGrabData:(NSArray*)theArray { 
    self.myMutArr = [NSMutableArray arrayWithObjects:obj1, obj2, nil]; 
} 
+0

感謝您的幫助。我將閱讀今天上面鏈接的主題。 – rdesign 2010-06-14 08:26:17

+0

我做了一個有趣的發現:如果我在viewDidLoad中聲明數組的內容,則數組在cellForRowAtIndexPath中仍然是滿的。 如果我在didGradb數據(委託方法)中聲明cellForRowAtIndexPath中的數組爲空。這裏有什麼問題? – rdesign 2010-06-14 08:42:47

1

您應該結束了與3擋計數,如果它是不是你嘗試初始化本身之前的內容數組的事實它存在。嘗試更換這行代碼:

self.myMuArr = [[[NSMutableArray alloc] initWithArray:myMuArr]retain]; 

這一行:

self.myMuArr = [NSMutableArray arrayWithArray:theArray]; 
+0

感謝您的幫助。不幸的是,這並沒有幫助。 – rdesign 2010-06-14 08:23:28