使用'performSelector'返回非id结果

时间:2011-12-03 12:31:11

标签: ios css-selectors nsobject accessor

出于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。

1 个答案:

答案 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'。如果我正确理解你的需要,这应该比你现在做的更简单。