Какао - определение свойств класса во время выполнения - PullRequest
2 голосов
/ 17 марта 2011

Это просто?Я на самом деле пытаюсь отслеживать, если объект меняется (чтобы определить, должен ли я его сохранить).В настоящее время у меня просто есть массив в объекте со списком всех его свойств readwrite, затем я перебираю его после создания объекта и добавляю наблюдателей:

for ( NSString *observer in _observers ){
    [self addObserver: self forKeyPath: observer options: NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context: nil];
}

Это работает, но если вы забудетедобавить свойство в массив, очевидно, наблюдатель не будет вызван.Кто-нибудь знает, как я могу просто определить свойства объекта во время выполнения?Я думал, что это может быть связано с RespondsToSelector: но я не смог найти много по этому вопросу.

Заранее спасибо!

Ответы [ 2 ]

6 голосов
/ 17 марта 2011

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

if ([myObject respondsToSelector: @selector(propertyName)]) {
    // your code here
}

Или, если вы хотите использовать строки в качестве имени селектора:

if ([myObject respondsToSelector: NSSelectorFromString(@"propertyName")]) {
    // your code here
}

Здесь propertyName является получателем (его имя подписи точно соответствует вашему объявленному имени свойства), поэтому, если вы хотите проверить наличие установщика, вы должны добавить дополнительное выражение:

[myObject respondsToSelector: @selector(setPropertyName:)])
3 голосов
/ 17 марта 2011

Может быть, это поможет:

Вы можете получить список свойств в классе, используя class_copyPropertyList

objc_property_t * class_copyPropertyList(Class cls, unsigned int *outCount)

, а затем из каждого свойства вы можете получить его имя, используя property_getName функция и атрибуты, использующие функцию property_getAttributes (если вам нужно отфильтровать свойства чтения-записи).

Подробнее см. Справочник по Objective-C Runtime

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...