我正在尝试将一些旧代码转换为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];
}
最佳答案
好吧,你的想法是对的。
但我可以给您使其更简单。
将您的应用程序代理设置为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
那将是非常适当的。
关于cocoa - ARC:当用户关闭窗口时,如何释放WindowController?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30229964/