ARC: Как вы выпускаете WindowController, когда пользователь закрывает окно?

Я пытаюсь перевести старый код в ARC. Старый код делает это в WindowController:

@interface PreferencesController () <NSWindowDelegate>

@end

@implementation PreferencesController

    -(void)windowWillClose:(NSNotification*) notification {

        [self autorelease];
    }

@end

Мой AppDelegate имеет сильный указатель на WindowController:

@property(strong) PreferencesController* preferencesCtrl;

В PreferencesController мне нужно объявить (слабый) указатель обратно на AppDelegate, а затем сделать что-то вроде этого:

-(void) windowWillClose:(NSNotification *)notification {

    [[self appDelegate] setPreferencesCtrl:nil];

}

2 ответа

Попробуйте использовать @autoreleasepool заставить немедленно dealloc когда вы ноль указатель.

-(void) windowWillClose:(NSNotification *)notification {

    //[[self appDelegate] setPreferencesCtrl:nil];
    @autoreleasepool {
        [[NSApp delegate] setPreferencesCtrl:nil];
    }
}

Вы также можете получить доступ к делегату приложения через NSApp синглтон с помощью NSApp.delegate, который [[NSApplication sharedApplication] delegate]хотя я полагаю, вам придется набрать его, чтобы избежать предупреждения. В любом случае.

Ну, ваши мысли верны.

Но я могу дать вам сделать это проще.

Установите делегата приложения как NSWindowDelegate.

@interface AppDelegate : NSObject <NSApplicationDelegate, NSWindowDelegate>

@property (strong) PreferencesController* preferencesCtrl;

@end

@implementation AppDelegate

- (void)doAction
{
  // create window
  // ...
  self.preferencesCtrl.window.delegate = self; // set window delegate
}

- (void)windowWillClose:(NSNotification *)notification 
  {
   self.preferencesCtrl=nil;
  }

@end

UPD Поскольку вы уже используете методы NSWindowDelegate, я предлагаю вам создать еще один протокол делегирования, скажем, PreferenceControllerDelegate

//in PreferenceController.h before class interface
@class PreferenceControllerDelegate

@protocol PreferenceControllerDelegate <NSObject>

- (void)preferenceControllerWindowWillClose:(PreferenceControllerDelegate *)sender;

@end 

@interface PreferenceController : NSWindowController

//...

@property (nonatomic,weak) id<PreferenceControllerDelegate> delegate;

//...

@end

Это было бы очень правильно.

Другие вопросы по тегам