2

我總是推新視圖控制器到堆棧是這樣的:爲什麼釋放視圖控制器會導致崩潰?

MyViewController *vc = [[MyViewController alloc] init]; 

[self.navigationController pushViewController:vc animated:YES]; 

[vc release]; 

而一切運作良好,當談到一起彈出它關閉堆棧:

[self.navigationController popViewControllerAnimated:NO]; 

但現在當我求婚vc關閉堆棧我在main.m中發生崩潰,提示線路訪問不良:int retVal = UIApplicationMain(argc, argv, nil, nil);

但是現在如果我註釋掉[vc release]沒有更多的崩潰?

但是爲什麼肯定會泄漏內存,因爲我沒有發佈我創建的東西?

+0

您是否嘗試在調試模式下運行它?找出它崩潰的確切路線。也許這與發佈無關,因爲您發佈的代碼似乎是正確的 – Sid 2011-06-03 18:17:07

+0

從控制檯發佈詳細消息,如果您不介意,MyViewController的代碼可能會有所幫助。 – Sid 2011-06-03 18:20:24

+3

請發佈回溯。事故並不在這條線上;它在彙編器的某一行大約有20個棧幀。你發佈的代碼很好,所以你在其他地方做了一些錯誤的事情,這些事情對視圖控制器的引用計數或其減量的一個對象做了一些不合適的事情,很可能是在'-dealloc'或'-viewDidUnload'期間遞減的一個對象。回溯應該告訴你究竟是什麼樣的對象,你做錯了什麼。 – 2011-06-03 18:24:25

回答

3

你的內存管理看起來很好。也許你是在管理你的虛擬內存管理不善。 MyViewController的dealloc方法是什麼樣的?

我的猜測是你使用的是不正確的init方法(也許是initWithNibName:bundle :),你正在釋放從未正確初始化的dealloc中的ivars。

+0

所以我使用initWithNibName並沒有更多的崩潰!這對我來說是新的,因爲我始終使用init,而不管IB或手動創建。這仍然讓我有點在黑暗中......我標記了這篇文章,作爲答案,儘管其他人也這樣說,我不認爲我被允許標記多個帖子作爲答案?感謝大家的意見,並指出我的缺點! ;-) – user7865437 2011-06-03 19:47:38

0

你有沒有嘗試使用它作爲一個

@property 
+0

不,因爲我從來沒有這樣做過呢?我會給它一個去,但很困惑... – user7865437 2011-06-03 18:14:12

+0

使用@property(nonatomic,保留) – Legolas 2011-06-03 18:15:04

+3

不,我不認爲使這個視圖控制器屬性會幫助。我有一種感覺,這次崩潰與他沒有發佈的代碼有關...... – Sid 2011-06-03 18:19:49

0

導航控制器將保留vc然後,當vc被彈出,navigationController釋放它和vc deallocs。

因此,您必須保留髮布代碼,這是正確的。

我認爲你必須使用一個initWithNibName:bundle: insted的init

+0

不,我認爲他在推送VC之後調用版本是正確的。如果你使用IB構建VC,你應該使用initWithNibName,否則init很好。 – Sid 2011-06-03 18:16:03

+0

我剛纔說他必須在推VC後調用release :) 對於initWithNibName,這可能是我的錯。 – DreamOfMirrors 2011-06-03 18:20:24

+0

哦,哈哈抱歉,我的壞,我以爲你是告訴他不要釋放它.....這就是缺乏咖啡對我來說! – Sid 2011-06-03 18:21:25

0

他們不同的原因是你沒有分配文本對象,因此你不是所有者。國際局的工作是分配和調整它們,這是它的作用。

所以,如果你也嘗試釋放它,它會導致問題。

0

也許你錯誤地管理你的vc內的東西的內存。

@brandontreb這句話真的幫了我很大忙!我掙扎了整整一天了「模擬收到內存警告」後修正崩潰,整整descripted像:
Preventing bad access crash for popViewControllerAnimated in uinavigationcontroller setup

在我推視圖控制器的loadView :,通過視圖控制器自我其DataSource的init :.

LayoutPickerDataSource *pickerDataSource = [[LayoutPickerDataSource alloc] initWithController:self]; 

而DataSource類保留它喜歡:

@property (nonatomic, retain) LayoutViewController *viewController; 

修復崩潰只是更改爲:

@property (nonatomic, assign) LayoutViewController *viewController; 

,並刪除:

[viewController release]; 

賓果!我仍然不知道爲什麼!作爲viewController在dealloc:dataSource中發佈。

相關問題