Warum funktioniert der folgende Code? Es ist ein kleines Cocoa-Programm, das NSOpenPanel verwendet, um eine Datei auszuwählen und sie in Emacs.app zu öffnen. Es kann von der Kommandozeile mit dem Startverzeichnis als Argument ausgeführt werden.Wie wird die Cocoa-GUI-Klasse ausgeführt, ohne dass NSApplication oder NSRunLoop aufgerufen werden?
Wie läuft NSOpenPanel, ohne NSApplication oder NSRunLoop aufzurufen? Welche Einschränkungen gibt es für ein Cocoa-Programm, das NSApplication oder NSRunLoop nicht explizit startet? Ich hätte gedacht, einer von ihnen wäre: Sie können keine GUI verwenden. Vielleicht wird durch Aufrufen von NSOpenPanel ein Fallback-Code aufgerufen, der NSRunLoop aufruft. Ich habe Breakpoints auf + [NSApplication] und + [NSRunLoop alloc] gesetzt und sie wurden nicht ausgelöst.
main.m:
#import <Cocoa/Cocoa.h>
NSString *selectFileWithStartPath(NSString *path) {
NSString *answer = nil;
NSOpenPanel* panel = [NSOpenPanel openPanel];
panel.allowsMultipleSelection = NO;
panel.canChooseFiles = YES;
panel.canChooseDirectories = NO;
panel.resolvesAliases = YES;
if([panel runModalForDirectory:path file:nil] == NSOKButton)
answer = [[[panel URLs] objectAtIndex:0] path];
return answer;
}
int main(int argc, const char * argv[]) {
NSString *startPath = argc > 1 ? [NSString stringWithUTF8String:argv[1]] : @"/Users/Me/Docs";
printf("%s\n", argv[1]);
BOOL isDir;
if([[NSFileManager defaultManager] fileExistsAtPath:startPath isDirectory:&isDir] && isDir) {
system([[NSString stringWithFormat:@"find %@ -name \\*~ -exec rm {} \\;", startPath] UTF8String]);
NSString *file = selectFileWithStartPath(startPath);
if(file) [[NSWorkspace sharedWorkspace] openFile:file withApplication:@"Emacs.app"];
}
}
Ja, ich verstehe. Danke für die schnelle Antwort. Eine Sache, die ich gerade realisiert habe, ist, dass der alte klassische Apple main.m [NSApplication sharedApplication] aufruft, nicht [NSApplication allocate]. Ich nehme an, dass dem Aufruf von runModalForWindow möglicherweise zuvor ein Singleton [NSApplication sharedApplication] in der Apple-Bibliothek instanziiert wurde. – Colin