我正在尝试将一些旧代码翻译成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
答案 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]
单身人士访问应用代表,但我猜您必须对其进行类型转换以避免出现警告。无论哪种方式。