Заявленные свойства
Когда объявления свойства обнаружения компилятора (см. Заявленные Свойства в Языке программирования 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
сопровождаемый именем отступающей переменной экземпляра. Между ними атрибуты указаны следующими дескрипторами, разделенными запятыми:
Код | Значение |
---|---|
| Свойство только для чтения ( |
| Свойство является копией значения, в последний раз присвоенного ( |
| Свойство является ссылкой на значение, в последний раз присвоенное ( |
| Свойство является неатомарным ( |
| Свойство определяет пользовательское имя селектора метода get. Имя следует |
| Свойство определяет пользовательское имя селектора метода set. Имя следует |
| Свойство является динамичным ( |
| Свойство является слабой ссылкой ( |
| Свойство приемлемо на сборку «мусора». |
| Указывает тип с помощью кодирования старого стиля. |
Для примеров посмотрите Примеры Описания Атрибута Свойства.
Примеры описания атрибута свойства
Учитывая эти определения:
enum FooManChu { FOO, MAN, CHU }; |
struct YorkshireTeaStruct { int pot; char lady; }; |
typedef struct YorkshireTeaStruct YorkshireTeaStructType; |
union MoneyUnion { float alone; double down; }; |
следующая таблица показывает демонстрационные объявления свойства и соответствующую строку, возвращенную property_getAttributes
:
Объявление свойства | Описание свойства |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Примечание: компилятор предупреждает: |
|
|
|
|
|
В блоке реализации:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|