0

アプリでメモリ管理の問題とランダムなクラッシュが発生しています。コード全体をクリーンアップするために多くの作業を行い、プロジェクトを ARC に変換しました。

問題を明確に把握できるようになりました。基本的に、アプリはビューを解放しないため、ユーザーがアプリ内を移動すると、各ビューがリロードされ、最終的にメモリの問題によりアプリがクラッシュするまで保持されます。

UINavigationController があります。私のアプリは、横向きの左向きでのみ実行されます。私が使うとき

[window setRootViewController:viewController]; 

ロード後

[self.window addSubview:[finalViewController view]]; 

新しいビューは縦向きに表示されます。読み込み時にコードを左に横向きに回転すると、他のあらゆる種類のランダムな問題が発生します。

addSubview の代わりに使用する場合

[self.viewController.view removeFromSuperview]; 
[self.window setRootViewController:finalViewController];
viewController = nil; 
self.viewController = nil; 
window.viewController = nil;

回転は問題ありませんが、ビューが解放されず、アプリにメモリの問題があり、最終的にクラッシュします。どんな考えでも素晴らしいでしょう-おそらくここでかなり基本的なものが欠けていることに感謝します。ありがとう&ハッピーホリデー!

4

1 に答える 1

2

アプリに新しいビューをどのようにロードしていますか? UINavigationController を使用している場合、AppDelegate は次のように開始する必要があります。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    RootViewController* rootController = [[RootViewController alloc] init];
    UINavigationController* navController = [[UINavigationController alloc] initWithRootViewController:rootController];
    [self.window setRootViewController:navController];

    [self.window makeKeyAndVisible];

    return YES;
}

別のビューをロードするには (たとえば、ボタンを押して)、ルート ビュー内から次のようにします。

SecondViewController *secondView = [SecondViewController alloc] init];
[self.navigationController pushViewController:secondView animated:YES];

これにより、 UINavigationController がビューのメモリ管理を担当するようになります。

回転に関しては、各 ViewControllers に次のメソッドを与えることで処理されます。

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    if(interfaceOrientation == UIInterfaceOrientationLandscapeLeft) return YES;
    return NO;
}

UINavigationController を意図したとおりに使用している限り、非解放ビューを使用するべきではありません。UINavigationController を読む必要があります: http://developer.apple.com/library/ios/#documentation/uikit/reference/UINavigationController_Class/Reference/Reference.html

もう 1 つの可能性は、ビュー コントローラーの子ビューが親ビュー/コントローラーへの強い参照を持っていることです。これにより、子に保持カウント 1 を与え、子も親に保持カウント 1 を与えるため、親 ViewController の割り当て解除が停止します。これは、強参照と弱参照に関する情報を含む SO 投稿です。Objective-C で宣言された @property 属性 (非アトミック、コピー、強、弱)

于 2012-12-26T02:13:01.783 に答える