2015-05-14 3 views
0

Я пытаюсь перевести старый код в 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]; 

} 

ответ

1

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

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

Задайте делегат приложения как 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 

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

+0

Спасибо за ответ. My PreferencesController уже является делегатом для моего окна настроек (PreferencesController выполняет несколько действий в windowDidLoad), и IB не позволит мне перетащить выход делегата окна настроек на несколько объектов. Я осмотрелся, и есть некоторые решения, например. MultiDelegate, но они кажутся излишними для моих нужд. – 7stud

+0

@ 7stud посмотрите на обновление. – Astoria

1

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

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

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

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

Смежные вопросы