Si può fare questo? Sì e no (puoi fare qualsiasi cosa se sei abbastanza persistente). Sì, è possibile, ma no non è necessario. Indipendentemente da ciò, questo può essere fatto per l'incredibilmente persistente tra voi. Dal momento che la codifica di un esempio richiederà un po ', ho trovato un'anima generosa in rete che l'ha già fatto. Guarda at this repository on GitHub per il codice completo e le spiegazioni. Ecco alcuni frammenti:
cmacs_simple_msgSend((id)objc_getClass("NSApplication"), sel_getUid("sharedApplication"));
if (NSApp == NULL) {
fprintf(stderr,"Failed to initialized NSApplication... terminating...\n");
return;
}
id appDelObj = cmacs_simple_msgSend((id)objc_getClass("AppDelegate"), sel_getUid("alloc"));
appDelObj = cmacs_simple_msgSend(appDelObj, sel_getUid("init"));
cmacs_void_msgSend1(NSApp, sel_getUid("setDelegate:"), appDelObj);
cmacs_void_msgSend(NSApp, sel_getUid("run"));
Come si noterà, questo codice utilizza il runtime API Objective-C per creare un'AppDelegate finto. E la creazione della finestra è un processo coinvolto:
self->window = cmacs_simple_msgSend((id)objc_getClass("NSWindow"), sel_getUid("alloc"));
/// Create an instance of the window.
self->window = cmacs_window_init_msgSend(self->window, sel_getUid("initWithContentRect:styleMask:backing:defer:"), (CMRect){0,0,1024,460}, (NSTitledWindowMask | NSClosableWindowMask | NSResizableWindowMask | NSMiniaturizableWindowMask), 0, false);
/// Create an instance of our view class.
///
/// Relies on the view having declared a constructor that allocates a class pair for it.
id view = cmacs_rect_msgSend1(cmacs_simple_msgSend((id)objc_getClass("View"), sel_getUid("alloc")), sel_getUid("initWithFrame:"), (CMRect){ 0, 0, 320, 480 });
// here we simply add the view to the window.
cmacs_void_msgSend1(self->window, sel_getUid("setContentView:"), view);
cmacs_simple_msgSend(self->window, sel_getUid("becomeFirstResponder"));
// Shows our window in the bottom-left hand corner of the screen.
cmacs_void_msgSend1(self->window, sel_getUid("makeKeyAndOrderFront:"), self);
return YES;
Quindi sì. Puoi scrivere un'app Cocoa in puro C. Ma non la consiglierei. Il 90% di quel codice può essere sostituito da un file xib, e farlo in questo modo limita davvero la tua app perché le funzionalità più avanzate dello stack di sviluppo Apple sono davvero sulle funzionalità di Objective-C. Mentre è tecnicamente possibile fare tutto in questo modo, lo stai rendendo molto più difficile di quanto dovrebbe essere.
Xcode non è un requisito per la scrittura di un app Cocoa per OS X, ma riduce la difficoltà * sensibilmente *. A meno che tu non stia pianificando di scrivere un'applicazione X-Window e di affidarti a Quartz o qualche altro gestore di finestre per il tuo rendering, pure-C non succederà più. [Cacao minimalista con Objective-C] (http://www.cocoawithlove.com/2010/09/minimalist-cocoa-programming.html), quindi seppellire la tua logica di base in C è fattibile, ma alla fine potresti trovarne gran parte più facile usare semplicemente l'obiettivo-C flat-out alla fine. – WhozCraig
possibile duplicato di [Come scrivere app iOS puramente in C] (http://stackoverflow.com/questions/10289890/how-to-write-ios-app-purely-in-c) – SevenBits
Cosa vuoi mostrare nella finestra? Testo statico, testo modificabile, controlli dell'interfaccia utente, grafica 3D ...? – JWWalker