【问题标题】:Retain count problem iphone sdk保留计数问题iphone sdk
【发布时间】:2023-03-15 23:53:01
【问题描述】:

我正面临这样的内存泄漏问题:

  1. 我在 B 类中分配 A 类的对象。 // 保留 A 类对象的计数变为 1

  2. 我将对象放在 nsmutablearray 中。 // 保留 A 类对象的计数变为 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。
    // 保留本地数组中 A 类对象的计数 [category_type] 变为 1

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

        [category_type 发布];

      在这里,对象 a 只会被它所在的数组保留 - 当您不再需要它时,只需释放数组,它就会被释放。您无需担心自己删除或释放它,这由步骤 (1) 中的自动释放和释放数组来处理。

      【讨论】:

        猜你喜欢
        • 2011-11-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-14
        • 1970-01-01
        • 2011-04-05
        • 1970-01-01
        • 2012-02-09
        • 1970-01-01
        相关资源
        最近更新 更多