2010-06-13 82 views
0

我在头文件中声明的的NSMutableArray:在其他函数中保留count = 0?内存管理问题?

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

保留计数不会是0,应该是3,但我敢打赌,你去查看[计数](http://developer.apple.com/iphone/库/文档/ Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.html#// apple_ref/occ/instm/NSArray/count)这是数组中对象的数量,它是0.不同于保持计数。 – progrmr 2010-06-13 22:22:18

回答

1

我想你不明白时,可以保留和释放。看看this SO question and answer。阅读并理解它,阅读它链接的文章。它会帮助你很多。在iPhone上了解这一点至关重要。 (1)当你调用alloc/init时,你得到一个你拥有的数组(它被保留下来)。当你调用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,它给你,你需要保留,如果你想利用它的内存空间的所有权一个autoreleased数组和保持它。您的setter方法做到这一点:

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

感谢您的帮助。我将阅读今天上面链接的主题。 – rdesign 2010-06-14 08:26:17

+0

我做了一个有趣的发现:如果我在viewDidLoad中声明数组的内容,则数组在cellForRowAtIndexPath中仍然是满的。 如果我在didGradb数据(委托方法)中声明cellForRowAtIndexPath中的数组为空。这里有什么问题? – rdesign 2010-06-14 08:42:47

1

您应该结束了与3挡计数,如果它是不是你尝试初始化本身之前的内容数组的事实它存在。尝试更换这行代码:

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

这一行:

self.myMuArr = [NSMutableArray arrayWithArray:theArray]; 
+0

感谢您的帮助。不幸的是,这并没有帮助。 – rdesign 2010-06-14 08:23:28