2012-10-24 142 views
0

我是繼承UIViewController以防止代碼重複我的'masterButtons'和'subButtons'集。繼承UIViewController導致內存問題?

這一切都似乎是精美的工作,直到我意識到後約1200頁改變 - 只有3空白頁(只是按鈕和其他幾個對象顯示)應用程序將始終崩潰之間導航!

儀表(+測試的設備上)不顯示任何內存泄漏,但確實表明現有幾百這些按鈕對象的實例!('Created & Still Living'filter selected。) 另外,viewDidUnload/didReceiveMemoryWarning永遠不會被任何ViewControllers調用!

我的應用程序中的其他頁面上沒有這些問題(其中UIViewController不是子類別)。

所以看起來ViewController的內容正在被重新創建,並且之前創建的任何內容都不會被刪除。 UIViewController的子類化可能會導致這種情況嗎?有什麼我可以失蹤?

建議將不勝感激。 (我覺得扔我的Mac窗外的這個問題!

Top_ViewController  (contains 'MasterButtons') 
     v 
Area1_ViewController (subclass of TOP_ViewController) (contains 'subButtons', and a few texts fields etc.) 
     v 
aPage_ViewController (subclass of Area1_ViewController) (currently blank page) 

(使用ARC和故事。故事板視圖控制器有各自的「aPage_ViewController」作爲自己的階級。)

+0

如何/你在哪裏創建按鈕?請展示一些代碼... – sergio

+0

在iOS 6下,'viewDidUnload'已被棄用,並且永遠不會被調用,所以如果您在那裏做某些事情,您可能需要考慮更改應用程序的代碼/行爲以應對這些更改到API。 –

+0

是的,我將刪除viewDidUnload方法。 (我會稍後發佈一些代碼...) –

回答

1

如果以循環方式創建故事板,則可能會一直創建新的viewControllers。每個segue過渡都會創建新的viewController,因此可能不會發生內存泄漏,但會消耗內存。

您應該使用UITabBarControllerUINavigationController來回移動並且永遠不會創建循環。

此外viewDidUnload已在iOS6中棄用,您可能忽略了警告?

編輯:

嘗試這樣:

-(void)tab1_IsPressed:(UIButton *)paramSender{ 
    Top_ViewController *target_VC = (Top_ViewController*)[self.storyboard instantiateViewControllerWithIdentifier:@"page_1"]; 
    [self.navigationController popViewControllerAnimated:NO]; 
    [self.navigationController pushViewController:target_VC animated:NO]; 
} 
-(void)tab2_IsPressed:(UIButton *)paramSender{ 
    Top_ViewController *target_VC = (Top_ViewController*)[self.storyboard instantiateViewControllerWithIdentifier:@"page_2"]; 
    [self.navigationController popViewControllerAnimated:NO]; 
    [self.navigationController pushViewController:target_VC animated:NO]; 
} 
+0

我正在使用UINavigationController和此技術來更改頁面:Top_ViewController * target_VC =(Top_ViewController *)[self.storyboard instantiateViewControllerWithIdentifier:@「page2」]; [self.navigationController pushViewController:target_VC animated:NO];我真的希望每次都不會創建一個新的VC!有沒有辦法檢查? –

+0

你可以像'NSLog(@「%@」,self);''一樣在你自定義視圖控制器的'viewWillAppear'方法中打印'self'。然後在viewControllers之間切換並從控制檯驗證此地址保持不變。我建議你在Interface Builder中創建視圖控制器,而不是從代碼創建視圖控制器,你可以將class屬性設置爲你的自定義類。 –

+0

你曾經調用'navigationController'的'popViewControllerAnimated'方法嗎? –