Использование executeSelector для возврата результата без идентификатора - PullRequest
1 голос
/ 03 декабря 2011

Для целей отладки мне нужно вызвать метод доступа CGFloat из фрагмента кода, который генерирует селектор из имени iVar согласно;

- (CGFloat) myIVar {
    return myIVar;
}

Сеттер имеет вид;

- (void) setMyIVar: (CGFloat) p_myIVar {
    [self willChangeValueForKey: @"myIVar"];
    myIVar = p_myIVar;
    [self didChangeValueForKey: @"myIVar"];
}

Чтобы я мог проследить за обратными вызовами, я поместил раздел отладки в часть didChange кода НаблюденияValueForKeyPath ... и хочу вызвать метод доступа геттера для распечатки результата;

SEL genericGetter = NSSelectorFromString (p_keyPath);  // i.e. '[self myIVar]'
NSLog (@"Key: %@ changed to %3.6f", p_keyPath, [self performSelector: genericGetter]);

Проблема в том, что perormSelector возвращает идентификатор, который не может быть приведен к CGFloat. Кроме того, в документации Apple приводятся 3 примера на executeSelector, каждый из которых возвращает идентификаторы, но не говорит вам, что делать для результатов без идентификатора.

Может кто-нибудь сказать мне, как реализовать логику, которую я пытаюсь использовать, пожалуйста? Заранее большое спасибо, ВВ.

1 Ответ

3 голосов
/ 03 декабря 2011

Вы можете получить упаковку бесплатно, используя valueForKey:

Опять же, учитывая это:

- (CGFloat) myIVar {
    return myIVar;
}

Примерно так будет работать:

id *value = [self valueForKey:@"myIVar"];
// if myIVar is a float, then value will be of type NSNumber
// if myIVar were an NSString, then value will be an NSString

И есливсе, что вы делаете, это регистрируете это, тогда вы можете напрямую записывать 'value'.Если я правильно понимаю ваши потребности, это должно быть проще, чем то, что вы делаете сейчас.

...