Perché il seguente codice funziona? È un piccolo programma Cocoa che utilizza NSOpenPanel per selezionare un file e aprirlo in Emacs.app. Può essere eseguito dalla riga di comando con la directory di partenza come argomento.Com'è possibile eseguire la classe della GUI Cocoa senza richiamare NSApplication o NSRunLoop
Come viene eseguito NSOpenPanel senza richiamare NSApplication o NSRunLoop? Quali sono le limitazioni su un programma Cocoa che non avvia esplicitamente NSApplication o NSRunLoop? Avrei pensato che uno di questi era: non puoi usare alcun tipo di interfaccia grafica. Forse invocando NSOpenPanel, viene chiamato un codice di fallback che richiama NSRunLoop? Ho inserito i breakpoint su + [allocazione NSApplication] e + [allocazione NSRunLoop] e non sono stati attivati.
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"];
}
}
Sì, capisco. Grazie per la risposta veloce. Una cosa che ho appena capito è che le vecchie chiamate main.m di Apple [NSApplication sharedApplication], non [NSApplication alloc]. Immagino che la chiamata a runModalForWindow possa essere stata preceduta istanziando un singleton [NSApplication sharedApplication] nella libreria Apple. – Colin