所以我是Objective-C的新手,但是对C ++很有经验,我很努力 让这个应用程序端口工作的时间。
这是一个非常简单的托盘菜单应用程序,它使用了几个基础框架类,并使用make like build脚本直接从终端构建。所以它没有xcode项目。
除菜单外,它还有一个窗口,用于OAuth样式登录。该窗口附有WebView。
应用程序的Objectice-C部分并不大,但有很多C ++交互。
所以在我的AppDelegate.h中我有以下内容。我不确定loginWindow是否应该强大。
@property (strong) NSWindow * loginWindow;
@property (strong) IBOutlet WebView * loginView;
@property (strong) NSString * state;
带来这个的代码在这里:
- (IBAction)LoginClicked:(id)sender
{
NSLog(@"Login Clicked");
//if (!self.loginWindow){
NSLog(@"Create loginWindow");
NSUInteger windowStyle = (NSTitledWindowMask | NSClosableWindowMask);
NSRect windowRect = NSMakeRect(100, 100, 400, 570);
self.loginWindow = [[NSWindow alloc] initWithContentRect:windowRect styleMask:windowStyle backing:NSBackingStoreBuffered defer:NO];
[self.loginWindow setTitle:@"ORBX Launcher - Login"];
//}
//if (!self.loginView){
NSLog(@"Create loginView");
self.loginView = [[WebView alloc] init];
[self.loginView setFrameLoadDelegate:self];
[self.loginView setPolicyDelegate:self];
[self.loginWindow setContentView:self.loginView];
//}
self.state = [NSString stringWithUTF8String:mString::Format("%.6f%08x", GetAccurateTime(), getpid()).str()];
NSString *complete = [NSString stringWithFormat:@"%@%@", LoginURL, self.state];
[[self.loginView mainFrame] loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:complete]]];
[self.loginWindow makeKeyAndOrderFront:NSApp]; // Show window
}
因为可以从菜单中多次选择登录,所以我不想再次重新创建整个窗口。这就是我在那里拥有!self.loginWindow的原因。
因此,在登录过程中,我捕获了一个重定向到" localhost"用于表示完成的信号,在此期间我调用[self.loginWindow close]。
直到这一点,它还没问题。但是如果我注销然后再次调用login,它会执行段错11。所以我想也许它与需要重新创建的窗口有关。所以我想我会发布它。如果我将窗口指定为nil,显然ARC会为我做。所以我在关闭后尝试了。
_loginWindow = nil
现在登录完成后就会出现段错误。即在摧毁窗户时。也许该视图需要首先销毁?
_loginView = nil
还有一个段错误。
我想您可以说我看到的行为与启用ARC的此问题中描述的行为相同。不幸的是,没有答案。
Cocoa ARC: Remove window from memory
我做错了什么?