2011-03-24 77 views
0

我有一個方法,一個奇怪的問題被稱爲每次按下按鈕時:請幫助:UINavigationController的和視圖控制器內存管理

- (void)launcherView:(TTLauncherView*)lnchr didSelectItem:(TTLauncherItem*)itm { 
    MyObject* obj = ... 

    MyViewController* detailView = [[MyViewController alloc] init]; // line A 
    [self.navigationController pushViewController:detailView animated:YES]; 
    [detailView setObject:obj]; 
    detailView = nil; // should I also release it? -- line B 
} 

的問題是,我道歉,我不得不釋放的DetailView(內存工具顯示我我有一個內存泄漏是它沒有完成),也因爲navigationController應該保留我的detailView,但如果我嘗試添加autorelease行「A」或行「B」,或簡單地發佈detailView排行「B」(當然在將它分配給nil之前),程序崩潰時會發送EXC_BAD_ACCESS原因釋放消息發送到釋放實例[CALayer] ...

有什麼想法? 非常感謝

回答

1

請問這項工作沒有崩潰?

- (void)launcherView:(TTLauncherView*)lnchr didSelectItem:(TTLauncherItem*)itm { 
    MyObject* obj = ... 

    MyViewController* detailView = [[MyViewController alloc] init]; 
    [self.navigationController pushViewController:detailView animated:YES]; 
    //[detailView setObject:obj]; // <- What's this for? 
    [detailView release] 
} 
+0

[detailView setObject:obj];將MyViewController的視圖標籤標題設置爲MyObject屬性。我已經瞭解到,在試圖設置標籤&Co.之前,我必須顯示我的基於NIB的視圖,否則我的IBOutlet控制器中的標籤屬性被setObject方法找到爲零,因此setObject變得毫無用處......是不是真的? – 2011-03-25 16:39:19

+0

我已經按照你的建議進行了嘗試,但它不會崩潰......所以,崩潰似乎取決於[detailView setObject:obj]調用! 但我必須設置我的IBOutlet的屬性後推視圖控制器,否則所有的IBOutlets將零,不是嗎? 我在MyViewController中的setObject上的當前實現釋放以前保留的obj,然後保留obj,然後相應地設置IBOutlet的屬性(標題)。啊,「obj」是Core Data的一個ManagedObject。 – 2011-03-25 17:18:53

+0

我的錯誤,時間浪費的時間! :)謝謝你的回答:我在我的setObject方法中發現了一個不正確的對象釋放。非常感謝,再次抱歉。 – 2011-03-25 17:49:33

2

嘗試這樣

- (void)launcherView:(TTLauncherView*)lnchr didSelectItem:(TTLauncherItem*)itm { 
    MyObject* obj = ... 

    MyViewController* detailView = [[MyViewController alloc] init]; 
    [detailView setObject:obj]; 
    [self.navigationController pushViewController:detailView animated:YES]; 
    [detailView release]; 
    detailView = nil; // now this will be optional 
} 
+0

沒辦法,它以同樣的方式崩潰。我也做了如下嘗試:在retain屬性中轉換「object」,並實現了一個新的「refreshView」方法,該方法採用保留的「object」實例並相應地設置detailView標籤,然後再調用[detailView setObject:obj] pushView(如你所建議的),然後在pushViewController調用後立即插入[detailView refreshView],但是崩潰依然存在。 我必須在pushViewController之後設置detailViews IBOutlets,因爲(我由於內存使用優化而道歉)如果我在它們全部爲零之前調用它,那麼! – 2011-03-25 17:08:36

0

嘗試「initwithnibname」

無關,但如果你追的內存泄漏不要忘記釋放MyObject來

+0

謝謝,MyObject保留/正確發佈:我簡單地省略了它,以簡化代碼示例:) – 2011-03-25 16:40:56

+0

爲什麼initWithNibName應該不同? – 2011-03-25 17:20:56

-1

當您設置detailView = nil;不釋放它,只有你零的指針記憶。內存塊仍然分配,直到您釋放它爲止。

您必須在detailView = nil之前使用[detailView release],否則您將無法再次引用該內存塊(內存泄漏)。

+0

對不起,正如我已經說過,我想我應該釋放它以避免內存泄漏,但我已經嘗試過,應用程序因「EXC_BAD_ACCESS」導致釋放消息發送到釋放實例[CALayer]「崩潰」,這是真正的問題! – 2011-03-25 16:43:14