2010-08-24 62 views
11

我很努力,以找出是否pushViewController保留了控制,目前我有以下代碼(工作)...pushViewController是否保留控制器?

ColorController *colorController = [[ColorController alloc] initWithNibName:nibColor bundle:nil]; 
[[self navigationController] pushViewController:colorController animated:YES]; 
[colorController release]; 

但正在考慮去除釋放並添加一個自動...

ColorController *colorController = [[[ColorController alloc] initWithNibName:nibColor bundle:nil] autorelease]; 
[[self navigationController] pushViewController:colorController animated:YES]; 

非常感謝

加里

+0

我會在這裏使用'release',因爲你知道你已經完成了'colorController'和'UINavigationController#pushViewController:animated'保留'colorController'。但是,'autorelease'也可以。 – ma11hew28 2011-05-05 15:14:49

回答

11

這無助...

ColorController *colorController = [[ColorController alloc] initWithNibName:nibColor bundle:nil]; 
[[[self navigationController] pushViewController:colorController animated:YES] autorelease]; 

您正在autoreleasing pushViewController的返回值:animated :,這是無效的。

您的第一個片段是有效的,並且是正確的。 pushViewController:確實保留了推送的控制器。

編輯:在您更新的代碼中,兩個樣本幾乎沒有差異。兩者都保持適當的保留計數但是,除非必要,否則避免使用autoRelease是一種「最佳做法」(特別是在內存敏感的區域,如iPhone)。這有助於您的應用程序保持更可預測和可管理的內存佔用。

+0

謝謝,再次抱歉,將autorelease放在錯誤的行上。就是我以後的樣子。 – fuzzygoat 2010-08-24 18:24:58

+0

錯別字發生,只是想確保它不是故意的!哈哈。 – 2010-08-24 18:43:22

+0

爲避免編碼錯誤,最好還是選擇autorelease。你選擇哪一個? 那麼,如果儀器告訴你,自動釋放佔用大量的CPU或內存,那麼確定你可以使用顯式釋放調用。但這是不太可能的。 – 2010-08-30 14:26:21

0

它確實如此。任何時候當你將一個對象賦給另一個這樣的SDK對象時,它將被保留。儘管第二行並沒有將你的想法解讀出來。爲了清楚起見,您通常需要autoreleaseinit在同一行。

ColorController *colorController = [[[ColorController alloc] initWithNibName:nibColor bundle:nil] autorelease]; 
[[self navigationController] pushViewController:colorController animated:YES]; 
4

是的,視圖控制器被保留。

您發佈的兩個代碼塊之間沒有太大區別(至少我看到的版本 - 其他人可能會看到與autorelease錯位調用的較早版本)。你可以使用任何一個。這是一個風格問題。

+0

謝謝Shaggy Frog,非常感謝。 – fuzzygoat 2010-08-24 18:24:13

0

如果想嘗試,你應該試試這個

id temp = [self.navigationController.viewControllers objectAtIndex:1]; 
[self.navigationController popToViewController:temp animated:YES]; 

你會被導航到任何其他先前的ViewController是在棧中可用。

相關問題