我在头文件中声明了一个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)
答案 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];
}