出于debuging目的,我需要从一段代码中调用CGFloat访问器方法,该代码根据iVar的名称生成一个选择器;
- (CGFloat) myIVar {
return myIVar;
}
setter的格式为
- (void) setMyIVar: (CGFloat) p_myIVar {
[self willChangeValueForKey: @"myIVar"];
myIVar = p_myIVar;
[self didChangeValueForKey: @"myIVar"];
}
为了能够跟踪回调的路径,我在“observeValueForKeyPath ...”代码的'didChange'部分放了一个调试部分,我想调用getter访问器来打印出结果;
SEL genericGetter = NSSelectorFromString (p_keyPath); // i.e. '[self myIVar]'
NSLog (@"Key: %@ changed to %3.6f", p_keyPath, [self performSelector: genericGetter]);
问题是'perormSelector'返回一个无法转换为CGFloat的id。此外,Apple的文档在performSelector上给出了3个示例,所有这些示例都返回id,但是它们并没有告诉您如何处理非id结果。
任何人都可以告诉我如何实现我要使用的逻辑吗? 非常感谢,VV。
答案 0 :(得分:3)
您可以使用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'。如果我正确理解你的需要,这应该比你现在做的更简单。