我正在嘗試創建一個功能強大的 MacOS 應用程式,但絕對沒有xib
或storyboard
檔案只是為了看看它是如何完成的。
在AppDelegate.m
我創建并顯示一個視窗并將應用程式設定為在最后一個視窗關閉后終止:
#import "AppDelegate.h"
@implementation AppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)Notification {
NSWindow *const Window = [[NSWindow alloc] initWithContentRect:(NSRect){.size = {800, 512}} styleMask:NSWindowStyleMaskTitled|NSWindowStyleMaskClosable|NSWindowStyleMaskMiniaturizable|NSWindowStyleMaskResizable backing:NSBackingStoreBuffered defer:YES];
[Window center];
[Window makeKeyAndOrderFront:Window];
// Insert code here to initialize your application
}
- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)Sender {
return YES;
}
@end
AppDelegate.h
:
#import <Cocoa/Cocoa.h>
@interface AppDelegate : NSObject<NSApplicationDelegate>
@end
檔案中Main.m
有以下內容:
#import <Cocoa/Cocoa.h>
#import "AppDelegate.h"
int main(void) {
@autoreleasepool {
[NSApplication sharedApplication].delegate = (AppDelegate *){[[AppDelegate alloc] init]}; // I also tried using setDelegate to no avail
[NSApp run];
}
return 0;
}
創建了一個視窗,但問題是當我關閉視窗時,應用程式崩潰,Thread 1: EXC_BAD_ACCESS (code=1, address=0x20)
在. 不知何故,應用程式無法正確終止并崩潰。顯然我錯過了一些東西,但問題是什么?[NSApp run]
Main.m
編輯:我注意到一個奇怪的情況,即只有在啟用ARC自動參考計數)時才會發生崩潰。
uj5u.com熱心網友回復:
問題是視窗在關閉時會自動釋放(并因此被釋放)。這與自動參考計數相結合,可能會產生一種雙重釋放錯誤。為了在不禁用 ARC 或禁用的情況下解決此問題releaseWhenClosed
,Window
我們將其設為全域變數或實體變數。這樣做會阻止 ARC 在已經通過關閉釋放視窗后釋放視窗。
NSWindow *Window;
// ...
- (void)applicationDidFinishLaunching:(NSNotification *)Notification {
Window = [[NSWindow alloc] initWithContentRect:(NSRect){.size = {800, 512}} styleMask:NSWindowStyleMaskTitled|NSWindowStyleMaskClosable|NSWindowStyleMaskMiniaturizable|NSWindowStyleMaskResizable backing:NSBackingStoreBuffered defer:YES];
[Window center];
[Window makeKeyAndOrderFront:Window];
// Insert code here to initialize your application
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/498201.html