ARC:当用户关闭Window时,如何释放WindowController?

时间:2015-05-14 05:35:34

标签: cocoa xcode6 nswindowcontroller

我正在尝试将一些旧代码翻译成ARC。旧代码在WindowController中执行此操作:

$('#newPropertyLocation').css('cursor','pointer');
$('#newPropertyLocation').change(function(){
    $('#addPropertyLocation').modal({
        show: 'true'
    });   
});

我的AppDelegate有一个指向WindowController的强指针:

    <script src="~/Scripts/angular.min.js"></script>


</section>`

在PreferencesController中,我是否需要将(弱)指针声明回AppDelegate,然后执行以下操作:

@interface PreferencesController () <NSWindowDelegate>

@end

@implementation PreferencesController

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

        [self autorelease];
    }

@end

2 个答案:

答案 0 :(得分: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

这将是非常恰当的。

答案 1 :(得分:1)

当您指针无效时,尝试使用@autoreleasepool强制立即dealloc

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

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

您还可以使用NSApp NSApp.delegate通过[[NSApplication sharedApplication] delegate]单身人士访问应用代表,但我猜您必须对其进行类型转换以避免出现警告。无论哪种方式。