2011-11-22 64 views
2

我在一个基于标签栏的应用 我有它的.xib A类和与它的.xib B类工作如何释放类对象被手动保留

在A级我加载B类的多个实例。

ie在A类,我在做。

在myGrid阵列我有救了网格的所有对象.m文件

-(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]; 
      } 
    } 

现在。

现在我将它们添加到类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对象。

+0

您可以在同一次迭代中调用此对象的释放方法,并简单地减少保留的计数。你面临什么问题? – Naved

+0

我试图释放它,但当我试图加载该视图与一些新的数据它告诉我,该消息发送到释放实例 –

+0

应该[[beta分配]为[B alloc]' – JeremyP

回答

6

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

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

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

您不需要传入[NSBundle mainBundle]initWithNibName:bundle: - 只需传入nil即可,因为默认行为是使用主包。

你的评论说你已经在标题中“分配”了一个NSMutableArray。你不要在标题中分配任何东西,你只需要声明一些东西。你实际上是否已经初始化了NSMutableArray

+0

对不起,我已经在.h中声明它,我正在初始化它在一个被viewDidAppear调用的函数中。我正在释放myGrid的dealloc函数。但是在类A上加载类B时,我想要执行某些操作,比如当我点击网格(类B视图)时,它会显示一个popOver,我们可以在网格中看到更大尺寸的数据。和许多其他功能。 –

2
  • 你拥有的任何对象时

您可以使用其名称以“黄金”, “新”,“复制”,或“mutableCopy”(一个方法创建一个对象创建例如,alloc,newObject,或者 mutableCopy)。

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

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

要释放GRID1使用[grid1 release];


注:没有任何理由保留/释放你的GRID1对象周期。只是

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

我不知道你休息的代码发生了什么,但它看起来像你有在另一个地方的一些内存泄漏。

+0

雅我也有内存泄漏,但每当我试图解决泄漏(如他们的任务结束时释放对象)应用程序崩溃。 –