0

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

4

2 回答 2

1

如果不是因为您尝试在数组存在之前使用其自身的内容对其进行初始化,那么您最终应该得到 3 的保留计数。尝试替换这行代码:

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

用这条线:

self.myMuArr = [NSMutableArray arrayWithArray:theArray];
于 2010-06-13T20:47:42.067 回答
1

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

您的数组被保留了 3 次,但您只需要一次:(1)当您调用 alloc/init 时,您会得到一个您拥有的数组(它被保留)。(2) 当你调用retain时,这是一个额外的retain。(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];
}
于 2010-06-13T22:19:02.107 回答