如何释放手动保留的类对象

时间:2011-11-22 11:07:26

标签: iphone objective-c memory-management ios4

我正在开发基于Tab Bar的应用程序 我有一个带有.xib的A类和一个带有.xib

的B类

在A类上,我正在加载B类的多个实例。

即在A班,我正在做。

<。>文件中的

   -(void)renderData:(NSArray *)Data
    {
         for(int i=0;i<[Data count];i++)
            {
               B *grid=[[B alloc]initWithNibName:@"Beta" bundle:[NSBundle mainBundle]];
               .
               .
               . //do something with the grid object i.e assign new image etc..)
               [self.myGrid addObject:grid]; //i have a NSMutableArray myGrid declared in .h
               [grid release];  
            }
    }

现在在myGrid数组中我保存了网格的所有对象。

现在我将它们添加到Aplha类视图中。

    for(int i=0;i<[myGrid count];i++)
      {
        B *grid1=[[myGrid objectAtIndex:i]retain]; //i have done this retain because when i try to come back to this tab or try to call the same function it crashes by saying message send to deallocated instance.
        [self.view addSubview:grid1.view];
       }

现在我的问题是如何释放我保留的grid1对象。

2 个答案:

答案 0 :(得分:6)

你正在接近这个错误。这里的问题不是如何释放grid1对象,这就是为什么你要保留它们的原因。你很可能不应该;你需要更彻底地调查原始崩溃。

如果grid1对象存储在self.myGrid中,则该数组将保留它们。你在任何地方发布myGrid吗?只要保留,您的grid1对象就应该是。

此外,这里还有一些概念性问题。从笔尖加载视图控制器并将其视图添加为另一个视图控制器视图的子视图通常是不正确的。如果不确切知道你想要达到的目的,很难推荐正确的方法。

您无需将[NSBundle mainBundle]传递给initWithNibName:bundle: - 您可以简单地传入nil,因为默认行为是使用主数据包。

您的评论表明您已在标题中“分配”了NSMutableArray。您没有在标题中指定任何内容,只需声明内容即可。您是否实际在实施中的某处初始化了NSMutableArray

答案 1 :(得分:2)

  • 您拥有
  • 时创建的任何对象
  

使用名称以“alloc”开头的方法创建对象,   “new”,“copy”或“mutableCopy”(例如,alloc,newObject或   mutableCopy)。

  • 当你不再需要它时,你必须放弃一个人的所有权 你拥有的对象
  

您通过向对象发送释放消息来放弃对象的所有权   或自动发布消息。在可可术语中,放弃   因此,对象的所有权通常被称为   “释放”一个物体。

要发布 grid1 ,请使用[grid1 release];


注意:没有理由在循环中保留/释放grid1对象。刚

B *grid1 = (B*)[myGrid objectAtIndex:i];
[self.view addSubview:grid1.view];

我不知道您的其他代码发生了什么,但看起来您在其他地方有一些内存泄漏。