0

MyAppDelegateはいくつかのバックグラウンド処理を行っており、この間にいくつかのビューを更新する必要があるため、作成される各コントローラーへの参照を保存しています。

@interface MyAppDelegate : NSObject <UIApplicationDelegate> {
    SomethingController *currentSomethingController;
}
@property (nonatomic, retain) SomethingController *currentSomethingController;

これは、コントローラーを開くために行われます。

- (void)openSomethingController {
    MyAppDelegate * app = [[UIApplication sharedApplication] delegate];
    app.currentSomethingController = [[SomethingController alloc] init];
    [self presentModalViewController:app.currentSomethingController animated:NO];
}

そして、これはコントローラー内で呼び出されて閉じます。

- (void)dismissSelf
{
    MyAppDelegate * app = [[UIApplication sharedApplication] delegate];
    [app.currentSomethingController release];
    app.currentSomethingController = nil;
[self dismissModalViewControllerAnimated:NO];
}

MyAppDelegateでは、コントローラーはコントローラーにメッセージを送信しています。

- (void)longRunningBackgroundTask {
    [currentSomethingController performSelectorOnMainThread:@selector(updateData) withObject:nil waitUntilDone:YES];
}

Product-> Analysisを実行すると、「潜在的なリーク」と「誤ったデクリメント」の警告が表示されます。これを行う正しい方法は何ですか、または私のアプローチが大丈夫だと仮定すると、これらの行を無視するように分析ツールに指示するにはどうすればよいですか?

4

1 に答える 1

0

あなたのコードは問題ないように見えますが、なぜそれをしているのですか? コードを読んでいる部外者に混乱を招く可能性があります。また、プロパティで release を明示的に呼び出すべきではありません。プロパティ自体でメモリ管理を行う必要があるため、次のようにコードを書き直してください。

- (void)openSomethingController {
    MyAppDelegate * app = [[UIApplication sharedApplication] delegate];
     SomethingController *controller=[[SomethingController alloc] init];
    app.currentSomethingController = controller;
    [controller release];
    [self presentModalViewController:app.currentSomethingController animated:NO];
}

その後

- (void)dismissSelf
{
    MyAppDelegate * app = [[UIApplication sharedApplication] delegate];
    app.currentSomethingController = nil;
   [self dismissModalViewControllerAnimated:NO];
}
于 2011-12-03T04:05:36.400 に答える