objective framework español apis iphone objective-c cocoa

iphone - framework - objective c swift 4



Objective-C 2.0: class_copyPropertyList(), cómo listar propiedades de categorías (2)

Sí, la función class_copyPropertyList devuelve las propiedades definidas en categorías.

Lo que está sucediendo aquí es que solo devuelve las propiedades definidas en el nivel de clase dado, por lo que solo está viendo las tres propiedades definidas en UIView y ninguna de las propiedades (normal o categoría) que están definidas en los ancestros UIResponder y NSObject.

Para lograr el listado completo heredado; debe recorrer los ancestros a través de la referencia Class.superclass y agregar los resultados de class_copyPropertyList. Luego verá, por ejemplo, las diversas propiedades definidas en la categoría Accesibilidad de UIKits para NSObject.

¡Vine aquí buscando una manera de excluir las propiedades definidas en categorías de estos resultados!

Intenté enumerar todas las propiedades de una clase de Objective-C como se describe en la Guía de programación en tiempo de ejecución de Objective-C 2.0 :

id LenderClass = objc_getClass("UIView"); unsigned int outCount, i; objc_property_t *properties = class_copyPropertyList(LenderClass, &outCount); for (i = 0; i < outCount; i++) { objc_property_t property = properties[i]; fprintf(stdout, "%s %s/n", property_getName(property), property_getAttributes(property)); }

Pero esto lista solo tres propiedades:

userInteractionEnabled Tc,GisUserInteractionEnabled layer T@"CALayer",R,&,V_layer tag Ti,V_tag

Mirando el archivo de encabezado para UIView.h esas son las tres propiedades declaradas directamente en la clase. Las otras propiedades de UIView se agregan a través de categorías.

¿Cómo obtengo todas las propiedades de una clase, incluidas las que provienen de categorías?

Intenté esto con el simulador de iPhone (iPhone SDK 2.2.1), por cierto. (En caso de que esto sea importante).


Según mis pruebas aquí, las propiedades de las categorías se mostrarán cuando se use class_copyPropertyList . Parece que las propiedades que está viendo en UIView solo se describen como propiedades en los encabezados públicos, y no se declaran como tales cuando se construye el UIKit. Probablemente adoptaron la sintaxis de propiedad para hacer un poco más rápida la creación de encabezados públicos.

Para referencia, aquí está mi proyecto de prueba:

#import <Foundation/Foundation.h> #import <objc/runtime.h> @interface TestClass : NSObject { NSString * str1; NSString * str2; } @property (nonatomic, copy) NSString * str1; @end @interface TestClass (TestCategory) @property (nonatomic, copy) NSString * str2; @end @implementation TestClass @synthesize str1; @end @implementation TestClass (TestCategory) // have to actually *implement* these functions, can''t use @synthesize for category-based properties - (NSString *) str2 { return ( str2 ); } - (void) setStr2: (NSString *) newStr { [str2 release]; str2 = [newStr copy]; } @end int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; unsigned int outCount, i; objc_property_t *properties = class_copyPropertyList([TestClass class], &outCount); for (i = 0; i < outCount; i++) { objc_property_t property = properties[i]; fprintf(stdout, "%s %s/n", property_getName(property), property_getAttributes(property)); } [pool drain]; return 0; }

Y aquí está la salida:

str2 T@"NSString",C str1 T@"NSString",C,Vstr1