出于调试目的,我需要从一段代码中调用CGFloat访问器方法,该代码根据iVar的名称生成一个选择器;
- (CGFloat) myIVar {
return myIVar;
}
setter的形式是;
- (void) setMyIVar: (CGFloat) p_myIVar {
[self willChangeValueForKey: @"myIVar"];
myIVar = p_myIVar;
[self didChangeValueForKey: @"myIVar"];
}
所以我可以跟随回调的踪迹,我把一个调试部分在'didChange'部分的'observeValueForKeyPath…’代码,我想调用getter访问器来打印结果;
SEL genericGetter = NSSelectorFromString (p_keyPath); // i.e. '[self myIVar]'
NSLog (@"Key: %@ changed to %3.6f", p_keyPath, [self performSelector: genericGetter]);
问题是,'perormSelector'返回一个id不能被转换为CGFloat。此外,苹果的文档给出了3个关于performSelector的例子,它们都返回id,但它们没有告诉你如何处理非id结果。
谁能告诉我如何实现我试图使用的逻辑请?提前感谢VV。
您可以使用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'。如果我正确理解了你的需求,这应该比你现在所做的要简单。