Use C++ con Cocoa en lugar de Objective-C?
language-interoperability (7)
Me gustaría escribir aplicaciones que usen C ++ y los frameworks Cocoa porque Apple no está capacitando a Carbon 64-bit. C ++ parece ser bastante vanidoso en su implementación en Linux y Windows, pero en Mac OS X parece que se requieren piezas de código adicionales de Apple (como un envoltorio Obj-C). También parece que Apple está obligando a los desarrolladores a escribir en Objective-C en lugar de C ++, aunque podría estar equivocado.
Estoy tratando de encontrar un camino para escribir código en la Mac que sería fácil de mantener multiplataforma. Tener que escribir código en C ++ para Linux / Windows y luego reescribir porciones grandes en Objective-C sería muy ineficiente.
¿Hay alguna manera de escribir código en C ++ que sea compatible con el futuro y compatible con Xcode? Además, si esto es posible, ¿cómo mezclaría C ++ y Objective-C en Xcode? Gracias.
Aunque esto es una pregunta de años ...
He intentado hacer C ++ wrapper de algunas clases de Cocoa .
Fue una experiencia muy agradable. C ++ proporcionó una seguridad de tipo mejor que Objective-C, y me hizo escribir menos código. Pero el tiempo de compilación y la seguridad de la memoria son peores. Es posible, pero algunas características dinámicas no fueron fáciles de manejar. Creo que no tiene sentido tratarlo en C ++.
De todos modos mi proyecto finalmente fue abandonado debido al anuncio de Swift. Limpió todas las razones por las que quería usar C ++ al principio, y proporciona aún más y mejor.
Bueno, puede sonar tonto, pero en realidad podemos escribir código C ++ puro para crear una GUI para Mac OS X, pero debemos vincularlo con el marco Cocoa.
/*
* test1.cpp
* This program shows how to access Cocoa GUI from pure C/C++
* and build a truly functional GUI application (although very simple).
*
* Compile using:
* g++ -framework Cocoa -o test1 test1.cpp
*
* that will output ''test1'' binary.
*/
#include <CoreFoundation/CoreFoundation.h>
#include <objc/objc.h>
#include <objc/objc-runtime.h>
#include <iostream>
extern "C" int NSRunAlertPanel(CFStringRef strTitle, CFStringRef strMsg,
CFStringRef strButton1, CFStringRef strButton2,
CFStringRef strButton3, ...);
int main(int argc, char** argv)
{
id app = NULL;
id pool = (id)objc_getClass("NSAutoreleasePool");
if (!pool)
{
std::cerr << "Unable to get NSAutoreleasePool!/nAborting/n";
return -1;
}
pool = objc_msgSend(pool, sel_registerName("alloc"));
if (!pool)
{
std::cerr << "Unable to create NSAutoreleasePool.../nAborting.../n";
return -1;
}
pool = objc_msgSend(pool, sel_registerName("init"));
app = objc_msgSend((id)objc_getClass("NSApplication"),
sel_registerName("sharedApplication"));
NSRunAlertPanel(CFSTR("Testing"),
CFSTR("This is a simple test to display NSAlertPanel."),
CFSTR("OK"), NULL, NULL);
objc_msgSend(pool, sel_registerName("release"));
return 0;
}
No puede escribir una aplicación Cocoa por completo en C ++. Cocoa depende en gran medida de las capacidades de enlace finales de Objective-C para muchas de sus tecnologías centrales, como enlaces clave-valor, delegados (estilo Cocoa) y el patrón de acción objetivo. Los últimos requisitos de enlace dificultan la implementación de Cocoa API en un lenguaje encriptado y en tiempo de compilación como C ++ ⁱ. Por supuesto, puede escribir una aplicación pura de C ++ que se ejecuta en OS X. Simplemente no puede usar las API de Cocoa.
Entonces, tiene dos opciones si quiere compartir código entre aplicaciones C ++ en otras plataformas y su aplicación basada en Cocoa. El primero es escribir la capa del modelo en C ++ y la GUI en Cocoa. Este es un enfoque común utilizado por algunas aplicaciones muy grandes, incluyendo Mathematica . Su código C ++ se puede dejar sin cambios (no necesita extensiones de manzana "funky" para escribir o compilar C ++ en OS X). Es probable que su capa de controlador haga uso de Objective-C ++ (tal vez la extensión Apple "funky" a la que se refiere). Objective-C ++ es un superconjunto de C ++, así como Objective-C es un superconjunto de C. En Objective-C ++, puede hacer llamadas de paso de mensajes objc-style (como [some-objc-object callMethod];
) desde dentro de C ++ función. Por el contrario, puede llamar a las funciones C ++ desde el código ObjC como:
@interface MyClass {
MyCPPClass *cppInstance;
}
@end
@implementation MyClass
- (id)init {
if(self = [super init]) {
cppInstance = new MyCPPClass();
}
return self;
}
- (void) dealloc {
if(cppInstance != NULL) delete cppInstance;
[super dealloc];
}
- (void)callCpp {
cppInstance->SomeMethod();
}
@end
Puede encontrar más información sobre Objective-C ++ en la guide lenguaje Objective-C. La capa de vista puede ser pura Objective-C.
La segunda opción es usar un conjunto de herramientas de C ++ multiplataforma. El kit de herramientas de Qt puede ajustarse a la factura. Los usuarios de Mac desprecian los kits de herramientas multiplataforma porque no tienen todos los detalles de aspecto y apariencia exactamente correctos y los usuarios de Mac esperan pulido en la interfaz de usuario de las aplicaciones de Mac. Qt hace un trabajo sorprendentemente bueno, sin embargo, y dependiendo de la audiencia y el uso de su aplicación, puede ser suficiente. Además, perderá algunas de las tecnologías específicas de OS X, como Core Animation y algunas funciones de QuickTime, aunque hay reemplazos aproximados en la API de Qt. Como usted señala, Carbon no será portado a 64 bits. Como Qt está implementado en las API de carbono, Trolltech / Nokia tuvieron que transferir Qt a Cocoa API para que sea compatible con 64 bits. Tengo entendido que la próxima actualización de Qt (actualmente en versión candidata ) completa esta transición y es compatible con 64 bits en OS X. Es posible que desee echar un vistazo a la fuente de Qt 4.5 si está interesado en integrar C ++ y las API Cocoa.
ⁱ Durante un tiempo, Apple hizo que la API Cocoa estuviera disponible para Java, pero el puente requirió un ajuste exhaustivo de la mano y no pudo manejar las tecnologías más avanzadas, como las vinculaciones de valores clave descritas anteriormente. Actualmente, los lenguajes ligados al tiempo de ejecución, tales como Python, Ruby, etc., son la única opción real para escribir una aplicación Cocoa sin Objective-C (aunque, por supuesto, estos puentes usan Objective-C bajo el capó).
Sí, puedes mezclarlos.
Debe usar Objective-C para operar directamente en sus objetos de GUI y recibir notificaciones de ellos.
Estos objetos Objective-C pueden invocar directamente la lógica C ++ si los coloca en archivos .mm, en lugar de los archivos puros Objective-C .m. Tenga en cuenta que es posible que vea consejos más antiguos que sugieran usar una .M mayúscula para indicar Objective-C ++, pero esto es muy escamoso y es probable que lo confunda tanto como al compilador.
No necesita envolver todos y cada uno de los objetos de C ++, pero su código Objective-C deberá contener punteros para ellos.
Apple tiene una muestra completa de cacao con carbono o CPP. con algunos detalles más en el archivo Léame.
Sí, puedes usar C ++ (es decir, escribirlo en archivos * .cpp) e incluso mezclar C ++ y Objective-C dentro de archivos * .mm (el código Objective-C estándar se almacena en archivos * .m).
Por supuesto, todavía tiene que usar Objective-C para su interfaz de usuario y crear contenedores Objective-C para sus objetos C ++. Otra opción es cambiar a Qt, que es un Framework de C ++ que admite Windows, Mac OS X y Linux, y se lanzará bajo la LGPL con la próxima versión 4.5.
Si está escribiendo una aplicación puramente gráfica, es decir, está dibujando todo usando código, considere openFrameworks . Es un lenguaje de programación gráfica de código abierto construido sobre C / C ++. Tiene addons que permiten a las personas extender el idioma. Tienen un complemento para el iphone . Creo que viene con la biblioteca y los proyectos de XCode que te ayudarán a compilar aplicaciones para iPhone y iPod touch.
Si solo buscas usar C ++ de vanilla simple, esto es totalmente compatible y realmente no es diferente de cualquier otra plataforma. Xcode incluso tiene una plantilla para ello en Archivo> Nuevo proyecto> Herramienta de línea de comandos> Herramienta C ++. Además, varias bibliotecas populares de código abierto (libcurl, libxml2, sqlite, etc.) vienen con OS X y están disponibles para enlaces dinámicos. No es necesario que use Cocoa ni nada específico de Apple si no lo desea.
Si desea utilizar Cocoa en ciertas partes de su aplicación, eche un vistazo a Objective-C++ . Puede mezclar C ++ y Objective-C en el mismo archivo dándole una extensión de .mm, o haciendo clic con el botón derecho en el archivo en Xcode y seleccionando Obtener información> General y luego cambiando el Tipo de archivo a sourcecode.cpp.objcpp. La segunda opción es útil si tiene un archivo .cpp en el que desea usar Objective-C dentro de un #ifdef específico de Mac.