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
Это было бы очень правильно.