Заявленные свойства

Когда объявления свойства обнаружения компилятора (см. Заявленные Свойства в Языке программирования Objective C), он генерирует дескриптивные метаданные, связанные с классом включения, категорией или протоколом. Можно получить доступ к этим метаданным с помощью функций, поддерживающих поиск свойства по имени на классе или протоколе, получая тип свойства как @encode строка и копирование списка атрибутов свойства как массив струн до. Список заявленных свойств доступен для каждого класса и протокола.

Тип свойства и функции

Property структура определяет непрозрачный дескриптор к дескриптору свойства.

typedef struct objc_property *Property;

Можно использовать функции class_copyPropertyList и protocol_copyPropertyList получать массив свойств связалось с классом (включая загруженные категории) и протокол соответственно:

objc_property_t *class_copyPropertyList(Class cls, unsigned int *outCount)
objc_property_t *protocol_copyPropertyList(Protocol *proto, unsigned int *outCount)

Например, учитывая следующее объявление класса:

@interface Lender : NSObject {
    float alone;
}
@property float alone;
@end

можно получить список использования свойств:

id LenderClass = objc_getClass("Lender");
unsigned int outCount;
objc_property_t *properties = class_copyPropertyList(LenderClass, &outCount);

Можно использовать property_getName функция для обнаружения имени свойства:

const char *property_getName(objc_property_t property)

Можно использовать функции class_getProperty и protocol_getProperty получить ссылку на свойство с именем в классе и протоколе соответственно:

objc_property_t class_getProperty(Class cls, const char *name)
objc_property_t protocol_getProperty(Protocol *proto, const char *name, BOOL isRequiredProperty, BOOL isInstanceProperty)

Можно использовать property_getAttributes функция для обнаружения имени и @encode введите строку свойства. Для получения дополнительной информации строк типа кодировки, посмотрите Кодировки Типа; для подробных данных этой строки посмотрите Примеры Описания Атрибута Строки и Свойства Типа Свойства.

const char *property_getAttributes(objc_property_t property)

Соединяя их, можно распечатать список всех свойств, связанных с классом с помощью следующего кода:

id LenderClass = objc_getClass("Lender");
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));
}

Строка типа свойства

Можно использовать property_getAttributes функция для обнаружения имени, @encode введите строку свойства и другие атрибуты свойства.

Строка запускается с a T сопровождаемый @encode введите и запятая, и заканчивается с a V сопровождаемый именем отступающей переменной экземпляра. Между ними атрибуты указаны следующими дескрипторами, разделенными запятыми:

  Свойство Table 7-1 Declared вводит кодировки

Код

Значение

R

Свойство только для чтения (readonly).

C

Свойство является копией значения, в последний раз присвоенного (copy).

&

Свойство является ссылкой на значение, в последний раз присвоенное (retain).

N

Свойство является неатомарным (nonatomic).

G<name>

Свойство определяет пользовательское имя селектора метода get. Имя следует G (например, GcustomGetter,).

S<name>

Свойство определяет пользовательское имя селектора метода set. Имя следует S (например, ScustomSetter:,).

D

Свойство является динамичным (@dynamic).

W

Свойство является слабой ссылкой (__weak).

P

Свойство приемлемо на сборку «мусора».

t<encoding>

Указывает тип с помощью кодирования старого стиля.

Для примеров посмотрите Примеры Описания Атрибута Свойства.

Примеры описания атрибута свойства

Учитывая эти определения:

enum FooManChu { FOO, MAN, CHU };
struct YorkshireTeaStruct { int pot; char lady; };
typedef struct YorkshireTeaStruct YorkshireTeaStructType;
union MoneyUnion { float alone; double down; };

следующая таблица показывает демонстрационные объявления свойства и соответствующую строку, возвращенную property_getAttributes:

Объявление свойства

Описание свойства

@property char charDefault;

Tc,VcharDefault

@property double doubleDefault;

Td,VdoubleDefault

@property enum FooManChu enumDefault;

Ti,VenumDefault

@property float floatDefault;

Tf,VfloatDefault

@property int intDefault;

Ti,VintDefault

@property long longDefault;

Tl,VlongDefault

@property short shortDefault;

Ts,VshortDefault

@property signed signedDefault;

Ti,VsignedDefault

@property struct YorkshireTeaStruct structDefault;

T{YorkshireTeaStruct="pot"i"lady"c},VstructDefault

@property YorkshireTeaStructType typedefDefault;

T{YorkshireTeaStruct="pot"i"lady"c},VtypedefDefault

@property union MoneyUnion unionDefault;

T(MoneyUnion="alone"f"down"d),VunionDefault

@property unsigned unsignedDefault;

TI,VunsignedDefault

@property int (*functionPointerDefault)(char *);

T^?,VfunctionPointerDefault

@property id idDefault;

Примечание: компилятор предупреждает: "no 'assign', 'retain', or 'copy' attribute is specified - 'assign' is assumed"

T@,VidDefault

@property int *intPointer;

T^i,VintPointer

@property void *voidPointerDefault;

T^v,VvoidPointerDefault

@property int intSynthEquals;

В блоке реализации:

@synthesize intSynthEquals=_intSynthEquals;

Ti,V_intSynthEquals

@property(getter=intGetFoo, setter=intSetFoo:) int intSetterGetter;

Ti,GintGetFoo,SintSetFoo:,VintSetterGetter

@property(readonly) int intReadonly;

Ti,R,VintReadonly

@property(getter=isIntReadOnlyGetter, readonly) int intReadonlyGetter;

Ti,R,GisIntReadOnlyGetter

@property(readwrite) int intReadwrite;

Ti,VintReadwrite

@property(assign) int intAssign;

Ti,VintAssign

@property(retain) id idRetain;

T@,&,VidRetain

@property(copy) id idCopy;

T@,C,VidCopy

@property(nonatomic) int intNonatomic;

Ti,VintNonatomic

@property(nonatomic, readonly, copy) id idReadonlyCopyNonatomic;

T@,R,C,VidReadonlyCopyNonatomic

@property(nonatomic, readonly, retain) id idReadonlyRetainNonatomic;

T@,R,&,VidReadonlyRetainNonatomic