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

Posted

技术标签:

【中文标题】在其他功能中保留计数= 0?内存管理问题?【英文标题】:Retain count = 0 in other function? memory-management problem? 【发布时间】:2010-06-13 20:37:44 【问题描述】:

我在头文件中声明了一个 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,它应该是 3。但我敢打赌,你实际上检查了 count,它是数组中的对象数,它是 0。那不是与保留计数相同。 【参考方案1】:

我认为您不了解何时保留和释放。看看this 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];

【讨论】:

感谢您的帮助。我今天要阅读您在上面链接的主题。 我做了一个有趣的发现:如果我在 viewDidLoad 中声明了数组的内容,那么在 cellForRowAtIndexPath 中的数组仍然是满的。如果我在 didGradb 数据(委托方法)中声明 cellForRowAtIndexPath 中的数组为空。这里有什么问题?【参考方案2】:

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

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

用这一行:

self.myMuArr = [NSMutableArray arrayWithArray:theArray];

【讨论】:

感谢您的帮助。不幸的是,这没有帮助。

以上是关于在其他功能中保留计数= 0?内存管理问题?的主要内容,如果未能解决你的问题,请参考以下文章

cocos内存管理

object-c的内存管理机制

内存管理

Python是如何进行内存管理的?

python是如何进行内存管理的?

Swift2.0(17)内存管理ARC