Cómo desarrollar software IOS usando programación mixta de C y Objective-C
Usar C con Objective-C El compilador Objective-C de Apple permite a los usuarios mezclar libremente C y Objective-C en el mismo archivo fuente. El lenguaje mixto se llama Objective-C. Con él, puede utilizar bibliotecas C existentes en aplicaciones Objective-C. Puntos clave de mezclar Objective-C y C En Objective-C, los métodos se pueden llamar desde código C o desde Objective-C. En ambos idiomas los objetos son punteros y pueden usarse en cualquier lugar. Por ejemplo, una clase C puede usar un puntero a un objeto Objective-C como miembro de datos, y una clase Objective-C también puede tener un puntero a un objeto C como variable de instancia. El siguiente ejemplo ilustra esto. Nota: Xcode requiere que el archivo fuente tenga una extensión ".mm" para habilitar la extensión Objective-C del compilador.
Copiar código /* Hola.mm * Compilar con: g -x Objective-c -framework Foundation Hello.mm -o hola */#import lt; Foundation/Foundation.hgt; class Hola {privado: id Greeting_text; NSStringpublic: Hola() { saludo_texto = @"¡Hola mundo!"; } Hola(const char* inicial_saludo_texto) { saludo_texto = [[NSString alloc] initWithUTF8String: inicial_saludo_texto] } void say_hello() { printf("s/n" , [greeting_text UTF8String]); }}; @interface Saludo: NSObject {@private Hola *hola;}- (id)init;- (void)dealloc;- (void)sayGreeting;- (void)sayGreeting: (Hola* )saludo; @end@implementación Saludo- (id)init { if (self = [super init]) { hola = new Hola() } return self }- (void)dealloc { eliminar hola; }- (void)saludo { hola-gt; say_hello(); }- (void)saludo: (Hola*)saludo { say_hello() }@endint main() { NSAutoreleasePool *pool = [[NSAutoreleasePool; alloc] init]; Saludo *saludo = [[Saludo alloc] init]; [saludo saludo]; // gt; Hola mundo! Hola *hola = new Hola("¡Bonjour, mundo!"); ]; // gt; ¡Buen día! eliminar hola; [saludo lanzamiento]; retorno 0;} Así como puedes declarar estructuras C en interfaces OC, también puedes declarar clases C en interfaces OC.
Al igual que las estructuras C, las clases C definidas en las interfaces OC tienen un alcance global, no clases anidadas de clases OC (esto es consistente con el C estándar (aunque no C) que promueve estructuras anidadas definidas en el alcance del archivo). Para permitirle escribir código condicionalmente basado en variantes del lenguaje, el compilador OC define las constantes del preprocesador __cplusplus y __OBJC__, designadas como C y OC respectivamente. Como se mencionó anteriormente, OC no permite que las clases C hereden de objetos OC, ni las clases OC heredan de objetos C. Copiar código class Base { /* ... */ }; @interface ObjCClass: Base ... @end // ¡ERROR! clase Derivada: public ObjCClass ... // ¡ERROR! El polimorfismo como caso especial. Por tanto, los modelos de objetos de los dos lenguajes no son directamente compatibles. Más fundamentalmente, el diseño de los objetos Objective-C y C en la memoria es mutuamente incompatible, es decir, generalmente es imposible crear una instancia de objeto que sea válida desde la perspectiva de ambos lenguajes. Por tanto, no se pueden mezclar los dos tipos de jerarquías. Puede declarar clases C dentro de clases OC y el compilador tratará estas clases como si estuvieran declaradas en el espacio de nombres global. Como a continuación: Copiar código @interface Foo { class Bar { ... } // OK } @endBar *barPtr // OK OC permite estructuras C como variables de instancia, independientemente de si se declaran dentro de una declaración OC. Copiar código @interface Foo { struct CStruct { ... }; struct CStruct bigIvar; // OK } ... @end Después de Mac OS X 10.4, si configura el indicador del compilador fobjc-call-cxx-cdtors, puede utilizar una instancia de clase C que contiene funciones virtuales y constructores y destructores significativos sin argumentos definidos por el usuario como variables de instancia (gcc-4.2 establece el indicador del compilador fobjc-call-cpp-cdtors de forma predeterminada). Una vez asignadas las variables miembro de OC, la función alloc llamará al constructor en el orden de declaración. El constructor utiliza un constructor público, sin parámetros y apropiado. Antes de la variable miembro de OC reparto, el método reparto llama al destructor en orden inverso a la declaración. OC no tiene concepto de espacio de nombres. Las clases OC no se pueden declarar dentro de un espacio de nombres C, ni tampoco se pueden declarar espacios de nombres dentro de clases OC. Las clases, protocolos y categorías de OC no se pueden declarar en plantillas de C, y las plantillas de C no se pueden declarar dentro del alcance de las interfaces, protocolos y categorías de OC. Sin embargo, las clases de OC se pueden usar como parámetros de la plantilla C, y los parámetros de la plantilla C también se pueden usar como receptores o parámetros de expresiones de mensajes OC (no a través de selectores). C Ambigüedades y conflictos de vocabulario El archivo de encabezado de OC define algunos identificadores que todos los programas de OC deben contener. Estos identificadores identifican id, Class, SEL, IMP y BOOL. En el método OC, el compilador predeclara los identificadores self y super, al igual que la palabra clave this en C. A diferencia de C, self y super son sensibles al contexto y también pueden usarse para identificadores ordinarios además de los métodos OC. La lista de parámetros de métodos dentro del protocolo tiene 5 palabras clave sensibles al contexto (oneway, in, out, inout, bycopy). Estas no son palabras clave en otro contenido. Desde la perspectiva de un programador de OC, C ha agregado muchas palabras clave nuevas.
Aún puedes usar palabras clave C como parte de los selectores de OC, por lo que el impacto no es grave, pero no puedes usarlas para nombrar clases de OC y variables de instancia. Por ejemplo, aunque clase es una palabra clave en C, aún puede usar la clase del método NSObject: Copiar código [foo class] // OK Sin embargo, debido a que es una palabra clave, no puede usar clase como nombre de variable: Copiar código NSObject; *class; // Hay espacios de nombres separados para nombres de clases y nombres de categorías en Error OC. @interface foo y @interface(foo) pueden existir en el mismo código fuente al mismo tiempo. En OC, también puedes nombrar tus categorías usando nombres de clases o nombres de estructuras en C. Los identificadores de protocolo y plantilla utilizan la misma sintaxis pero tienen diferentes propósitos: Copiar código idlt; someProtocolNamegt; TemplateTypelt; SomeTypeNamegt; Finalmente, C tiene una ambigüedad de sintaxis cuando una etiqueta va seguida de una expresión que representa un nombre global, como esta: Copie la etiqueta del código: ::global_name = 3; se requiere un espacio después de los primeros dos puntos. OC tiene una situación similar y también requiere un espacio: Copiar selector de receptor de código: :: global_c _name Limitación OC no agrega la función C a la clase OC, ni agrega la función OC a la clase C. Por ejemplo, no puede llamar a objetos C usando la sintaxis OC, ni puede agregar constructores y destructores a objetos OC, ni puede usar this y self indistintamente. La arquitectura de clases es independiente. La clase C no puede heredar la clase OC y la clase OC no puede heredar la clase C. Además, no se admite el manejo de excepciones en varios idiomas. En otras palabras, una excepción lanzada por OC no puede ser detectada por el código C y, a la inversa, una excepción lanzada por el código C no puede ser detectada por el código OC.