关于释放对象的问题

时间:2011-03-25 13:46:46

标签: objective-c

我有一个包含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添加对象“my”时,添加了“my”的retainCount。 但我的阵容不是。这是否意味着我必须靠自己保留myArray? 或其他我能做的事。 在我发布“my”对象后,这段代码能正常工作吗?

[a objectAtIndex:0];

谢谢!

2 个答案:

答案 0 :(得分: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删除阵列),当然,您不能在{{1}中执行此操作因为dealloc永远不会被调用,直到dealloc被移除my

答案 1 :(得分:1)

我不确定这是否是上面的完整源代码,但是为了保留my.myArray,你必须实际分配一些内容。

所以在上面的例子中你创建了一个NSMutableArray:

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

然后你把你的课程添加到了它:

[a addObject:my];

但是你没有在哪里创建过数组并将其分配给myClass,如:

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

此时,myArray将获得对象的引用并保留它(因为您在myArray prop声明中指定了retain)。

也许如果你澄清了你想要做什么或发布了一些更完整的源代码?

相关问题