保留计数问题iphone sdk

时间:2010-06-10 06:08:46

标签: iphone memory-management memory-leaks

我正面临内存泄漏问题,如下所示:

  1. 我在B组中分配A类对象.//保留类A类对象的数量1

  2. 我将对象放在nsmutablearray中。 //保留一类物品的数量成为2

  3. 在另一个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。
    //保留本地阵列中的一类物体[category_type]成为1

  4. 现在在这个C类中,我正在创建一个A类对象,并在本地nsmutablearray中获取元素,如:

     A *a = [[A alloc]init]; 
     a = [category_type objectAtIndex:i];       
    

    //保留2个成员的数量[分配+保留对象的保留计数1]

  5. 我的问题是,我想保留我在tableview中显示的数组category_type,并希望在我在B类中执行的数组中填充新元素后释放它。所以在添加新元素之前,我正在删除B类中的所有元素并使它们为零,因此对a的引用现在为0.而在C类中,我发布了一个dealloc。

    但是在仪器 - &gt;泄漏中它显示我在C类中的这个A类对象泄漏。

    任何人都可以告诉我哪里出错了。

    提前完成。

2 个答案:

答案 0 :(得分:0)

我在B组中分配A类对象.//保留一类对象的数量成为1

我将对象放在nsmutablearray中。 //保留一类物体的数量成为2

在另一个C类中,我抓住这个nsmutablearray,在本地的nsmutablearray中获取该数组中的所有元素, // HOW R U FETCHING ???

发布第B类的第一个数组.//保留本地阵列中一类物体的数量1

现在在这个C类中,我正在创建一个A类对象并在本地nsmutable数组中获取元素。 //在本地阵列中保留新类别对象的数量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.

答案 1 :(得分:0)

我正在努力理解你的问题,这就是我认为你所说的:

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&amp; 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];
  1. (在B类和C类的dealloc方法中)

    [category_type release];

  2. 这里,对象a只是被它所在的数组保留 - 当你不再需要它时,只需释放数组并释放它。您不必担心将其删除或自行释放,这将由步骤(1)中的自动释放和释放阵列来处理。