使用 'performSelector' 返回非 id 结果



出于调试目的,我需要从一段代码中调用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'。如果我正确理解了你的需求,这应该比你现在所做的要简单。

最新更新