ARC和窗口/视图生命周期管理

时间:2015-12-17 22:56:40

标签: clang

所以我是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

我做错了什么?

0 个答案:

没有答案