我正在尝试将一些旧代码转换为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/

10-12 02:05