我有一个包含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];
谢谢!
答案 0 :(得分:3)
另一个很好的例子,说明你应该为什么......
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)。
也许如果你澄清了你想要做什么或发布了一些更完整的源代码?