ARC:当用户关闭窗口时,如何释放窗口控制器?



我正在尝试将一些旧代码转换为 ARC。 旧代码在窗口控制器中执行此操作:

@interface PreferencesController () <NSWindowDelegate>
@end
@implementation PreferencesController
-(void)windowWillClose:(NSNotification*) notification {
[self autorelease];
}
@end

My 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

那就太恰当了。

尝试使用@autoreleasepool在取消指针时强制立即dealloc

-(void) windowWillClose:(NSNotification *)notification {
//[[self appDelegate] setPreferencesCtrl:nil];
@autoreleasepool {
[[NSApp delegate] setPreferencesCtrl:nil];
}
}

您还可以使用NSApp.delegate通过NSApp单例访问应用程序委托,这是[[NSApplication sharedApplication] delegate],尽管我想您必须对其进行类型转换以避免警告。 无论哪种方式。

最新更新