Как обработать счет сохранения для контроллеров, сохраненных в AppDelegate? - PullRequest
0 голосов
/ 03 декабря 2011

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-> Analyse, я получаю предупреждения о «потенциальной утечке» и «неправильном уменьшении». Каков будет правильный способ сделать это или предположить, что мой подход в порядке, как я могу сказать инструменту анализа игнорировать эти строки?

1 Ответ

0 голосов
/ 03 декабря 2011

Даже если ваш код выглядит нормально, зачем вы это делаете?Это может привести к путанице при чтении вашего кода посторонним, также вы не должны явно вызывать 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];
}
...