在其他功能中保留计数= 0?记忆管理问题?

时间:2010-06-13 20:37:45

标签: iphone release retain

我在头文件中声明了一个NSMutableArray:

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)

2 个答案:

答案 0 :(得分:1)

如果不是因为你尝试在数组存在之前用自己的内容初始化数组,那么你最终应该保留3。尝试替换这行代码:

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

这一行:

self.myMuArr = [NSMutableArray arrayWithArray:theArray];

答案 1 :(得分:1)

我认为您不了解何时保留和发布。看看this SO question and answer。阅读它并理解它并阅读它链接到的文章。它会帮助你很多。在iPhone上了解这一点至关重要。

你的阵列被保留了3次,但你只需要一个: (1)当你调用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,它为您提供了一个自动释放的数组,如果您想获取其内存空间的所有权并保留它,则需要保留该数组。你的二传手会这样做:

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