2011-03-25 66 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