2011-03-25 62 views
0

我有一個包含NSArray對象的類。 這樣關於釋放對象的問題

#import <Foundation/Foundation.h> 


@interface myClass : NSObject { 
    NSArray *myArray; 
} 

@property (nonatomic, retain) NSArray *myArray; 

@end 

在.m文件,我在初始化init方法myArray的,並在dealloc方法釋放myArray的。

在一個方法中,我創建它的對象並將其添加到一個NSMutableArray。

myClass *my = [[myClass alloc] init]; 
NSLog(@"init finish %d",[my retainCount]); 
NSMutableArray *a = [[NSMutableArray alloc] init]; 
[a addObject:my]; 
NSLog(@"array added finish %d",[my retainCount]); 
NSLog(@"array added finish %d",[my.myArray retainCount]); 

[my release]; 

當我添加對象「我的」NSMutableArray,「我」的retainCount被添加。 但myArray沒有。這是否意味着我必須保留我的陣陣? 或其他我可以做的事情。 我釋放「我的」對象後,此代碼是否可以正常工作?

[a objectAtIndex:0]; 

謝謝!

+0

這段代碼實際上工作嗎?我沒有看到nd my.myArray之間的任何連接。如果你沒有在myClass中初始化它,myArray就是零。 myArray的所有者是myClass的一個實例。 – 2011-03-25 13:55:11

回答

1

我不確定這是否是上面的完整源代碼,但是爲了保留my.myArray,您必須實際分配一些內容。

因此,在你上面的例子中,你創建一個NSMutableArray:

NSMutableArray *a = [[NSMutableArray alloc] init]; 

然後你加到你的類吧:

[a addObject:my]; 

但沒有在那裏你創建了一個數組並把它分配給MyClass的如在:

NSArray *anArray = [[NSArray alloc] init.....]; 
my.myArray = anArray; 

在這一點上,myArray會得到一個對象的引用,並將r保留它(因爲您在myArray prop聲明中指定了保留)。

也許如果你澄清了你正在嘗試做什麼或發佈了一些更完整的源代碼?

3

另一個很好的例子,正是爲什麼你應該...

從來沒有調用-retainCount!

retainCount是無用的,誤導性和浪費您的時間。

在這種情況下,「意外」保留計數恰好爲零的原因是因爲my.myArray返回nil發生是因爲您從未將創建的可變陣列分配給myArray

你需要這樣的事情(類名大寫遵循慣例):

MyClass *my = [[MyClass alloc] init]; 
NSMutableArray *a = [[NSMutableArray alloc] init]; 
my.myArray = a; 
[a addObject:my]; 

注意,這造成my和陣列之間的保留週期。即您將需要手動從數組中刪除my(或my手動刪除陣列),只要你釋放myArray,當然,你不能這樣做,在dealloc因爲dealloc將永遠不會被調用,直到my已經從myArray刪除。

+0

這是我的想象還是你不得不說「最近不要再打電話-retainCount」了? – Richard 2011-03-25 18:26:06

+0

它似乎發生在波浪......沒有什麼,然後一起三個或四個問題。 – bbum 2011-03-25 20:07:18