2011-12-22 47 views
0

通常,当我们推视图控制器,我们将创建一个视图控制器对象,该行后,我们会推,然后松开。
但是,当我们在iOS5中运行它就会崩溃。所以我通过propery保留了这个对象,并把它声明为全局接口。现在它工作正常。保留视图控制器会占用大量内存吗?以下两种方案有什么区别?的viewController对象BAD_ACCESS?

一:

MyViewCOntroller *obj = [[MyViewCOntroller alloc] init]; 
[self.navigationController pushViewController:obj Animated:YES]; 
[obj Release] 

二:

self.obj = [[MyViewCOntroller alloc] init]; 
[self.navigationController pushViewController:self.obj Animated:YES]; 
[self.obj Release] 

回答

1

一般来说,除dealloc之外,您不应该发布property(self.obj)。
第二代码段应替换:

self.obj = [[MyViewCOntroller alloc] init]; 
[self.navigationController pushViewController:self.obj Animated:YES]; 

,另一个在下面添加到您的dealloc方法:

self.obj = nil; // Property will release itself and set the point to nil 

第一代码片段是OK,你alloced本地实例和之后发布用过的。

0

你为什么不初始化与笔尖您的视图控制器?

SearchView *secondViewController = [[SearchView alloc] initWithNibName:@"SearchView" bundle:nil]; 
    [self.navigationController pushViewController:secondViewController animated:YES]; 
    [secondViewController release]; 

小心保留任何物体。你必须完全确定你只是启动它然后释放它。如果你这样做,你可能不关心记忆。你的inits之间的区别是:在第一种情况下你创建了ner对象。这不是保留,但可能是泄漏,我不舒服。我认为你应该添加autorelease。在第二种情况下,你有一个对象的属性(probebly,retain?)在标题中。你必须释放它dealloc方法

+0

您没有回答我的问题,由于某些原因,我没有笔尖。 – nameless 2011-12-22 04:51:30

+0

我编辑了答案 – SentineL 2011-12-22 05:05:17

2

第一个应该是正确的,并请重新检测坠机原因。当您使用第一个视图控制器时,它不会崩溃。

至于差异:在第二个,如果你宣布obj作为一个自变量的var,你不使用ARC,你照顾obj像其他实例变量。你只需要在dealloc中发布。

0

你传递视图控制器的新对象? 如果是的话,你是释放新视图控制器的dealloc方法这个视图控制器属性?这将是一个双重版本。 示例编号2将解决这个问题,因为它可能在旧的视图控制器中具有(保留)类型属性,会将其保留计数设置为2.

相关问题