2012-01-23 4 views
5

¿Es seguro usar las clases definidas en su propio proyecto dentro de __tributo __ ((constructor)) funciones? ¿El tiempo de ejecución del Object-C tuvo la oportunidad de hacer lo que necesita hacer con sus clases cuando se llaman __attribute __ ((constructor))? ¿O no entiendo cómo el tiempo de ejecución carga las clases y no hay diferencia entre la clase de biblioteca y la suya en este contexto?seguro __tributo __ ((constructor)) clases de función

+0

¿Qué has probado? La documentación de GCC dice que este atributo no es actualmente compatible con Objective-C (http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html), y la documentación de Clang parece no mencionar el problema. – CRD

+1

@CRD Los constructores de imágenes se comportan como se esperaba utilizando ambos compiladores distribuidos con Xcode. – justin

+0

@Justin - tanto para documentación ;-) Parece que deberías publicar tu comentario como respuesta. Nathan, ¿por qué quieres usar este atributo en lugar de '+ initialize', que se ejecuta antes de usar una clase? – CRD

Respuesta

7

Sugeriré que use + initialize o + load en lugar del atributo, pero esa es mi preferencia.

El método + load de una clase se invoca cuando la clase está cargada por el tiempo de ejecución.

El método + initialize de una clase se llama antes que cualquier otro método de la clase.

A partir de los documentos de load:

En Mac OS X v10.5, el orden de inicialización es el siguiente:

  1. Todos los inicializadores en cualquier marco que hace referencia.
  2. Todos + cargar métodos en su imagen.
  3. Todos los inicializadores estáticos C++ y C/C++ atributo (constructor) funciona en su imagen.
  4. Todos los inicializadores en marcos que enlacen contigo.

Además:

  • método de carga + de una clase se llama después de que todos los métodos de carga + sus superclases.
  • Se llama a un método de carga de categoría después del método de carga propio de la clase.

En un método de carga +, puede por lo tanto enviar de manera segura otras clases no relacionadas de la misma imagen, pero es posible que aún no se hayan ejecutado los métodos de + carga en esas clases.

Lo que deja en claro que cualquier método atribuido o + load se ejecutará después de que se haya inicializado el tiempo de ejecución. Y como + load es un método en su clase y se ejecuta antes que cualquier método atribuido, entonces antes el tiempo de ejecución debe haber configurado su clase.

+0

+1 buen descubrimiento, CRD! – justin

0

Esas no son funciones, solo son notaciones de atributos del compilador. No cambiarán el código generado en absoluto.

+0

se usa para decir "llamar a esta función cuando se carga la imagen", y es compatible. la pregunta se relaciona con el orden de inicialización. piénselo de esta manera: * tengo un marco que tiene una función init y algunas clases objc. ¿Puedo usar de forma segura los tipos objc exportados por el framework dentro de la función constructora del framework? ¿se cargarán en el tiempo de ejecución en ese punto? * – justin

Cuestiones relacionadas