我正在开发基于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对象。
答案 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];
我不知道您的其他代码发生了什么,但看起来您在其他地方有一些内存泄漏。