【问题标题】:Retain count problem iphone sdk保留计数问题iphone sdk
【发布时间】:2023-03-15 23:53:01
【问题描述】:
我正面临这样的内存泄漏问题:
我在 B 类中分配 A 类的对象。 // 保留 A 类对象的计数变为 1
我将对象放在 nsmutablearray 中。 // 保留 A 类对象的计数变为 2 个
-
在另一个 C 类中,我正在抓取这个 nsmutablearray,获取所有类似的元素
for(NSInteger f=0; f< [appDelegate.category_type count]; f++)
{
[category_type addObject:[appDelegate.category_type objectAtIndex:f]];
}
在本地 nsmutablearray 中,释放 B 类的第一个数组,即 appDelegate.category_type。
// 保留本地数组中 A 类对象的计数 [category_type] 变为 1
-
现在在这个 C 类中,我正在创建 A 类的对象并获取本地 nsmutablearray 中的元素,例如:
A *a = [[A alloc]init];
a = [category_type objectAtIndex:i];
//a 的保留计数变为 2 [分配 + 保留计数为 1 的获取对象]
我的问题是,我想保留我在 tableview 中显示的这个数组 category_type,并希望在我在 B 类中执行的数组中填充新元素后释放它。所以在添加新元素之前,我正在删除 B 类中的所有元素并将它们设为 nil,因此对 a 的引用现在为 0。在 C 类中,我在 dealloc 中释放 a。
但在 Instruments->Leaks 中,它显示 C 类中的此类 A 对象的泄漏。
谁能告诉我哪里出错了。
提前谢谢。
【问题讨论】:
标签:
iphone
memory-management
memory-leaks
【解决方案1】:
我在 B 类中分配 A 类的对象。 // 保留 A 类对象的计数成为 1
我将对象放在 nsmutablearray 中。 // 保留 A 类对象的计数变为 2
在另一个类 C 中,我正在抓取这个 nsmutablearray,在本地 nsmutablearray 中获取该数组中的所有元素,//HOW R U FETCHING???
释放 B 类的第一个数组。 // 将 A 类对象的计数保留在 LOCAL ARRAY 中变为 1
现在在这个 C 类中,我正在创建 A 类的对象并获取本地 nsmutable 数组中的元素。 //本地数组中的新A类对象的保留计数变为2 [分配+保留计数为1的获取对象]
请详细说明这一点,以便于理解问题。
for(NSInteger f=0; f< [appDelegate.category_type count]; f++)
{
[category_type addObject:[appDelegate.category_type objectAtIndex:f]];
}
NSLog(@"appDelegate.category_type count => %d and category_type count => %d",[appDelegate.category_type count],[category_type count]);
试用编辑后的代码并查看两个数组的计数。两者都将打印相同的计数,意味着两者都有对象。 即使释放了 appDelegate.category_type 数组,您的对象的保留计数也将是 2 而不是 1。
【解决方案2】:
我正在努力理解你的问题,这就是我认为你在说的:
1.
A *a = [[A alloc] init];
2.
[category_type addObject:a];
3.
for(NSInteger f=0; f< [appDelegate.category_type count]; f++)
[category_type addObject:[appDelegate.category_type objectAtIndex:f]];
4。
A *a = [category_type objectAtIndex:i];
您需要告诉我们更多关于您在哪里释放对象的信息 - 在 (3) 中,您说您正在“释放 B 类的第一个数组” - 您可以向我们展示代码吗?
您似乎保留了该对象 3 次,但尚未发布任何代码显示它已被释放。
我认为你需要做更多这样的事情:
1 & 2.(B 类)
A *a = [[[A alloc] init] autorelease];
[category_type release];
category_type = [NSMutableArray alloc] init];
[category_type addObject:a];
3。 (C类)
[category_type release];
category_type = [[NSArray arrayWithArray:appDelegate.category_type] retain];
4.
A *a = [category_type objectAtIndex:i];
-
(在B类和C类的dealloc方法中)
[category_type 发布];
在这里,对象 a 只会被它所在的数组保留 - 当您不再需要它时,只需释放数组,它就会被释放。您无需担心自己删除或释放它,这由步骤 (1) 中的自动释放和释放数组来处理。