Ios 使用';性能选择器';返回非id结果的步骤

Ios 使用';性能选择器';返回非id结果的步骤,ios,css-selectors,nsobject,accessor,Ios,Css Selectors,Nsobject,Accessor,出于调试目的,我需要从一段代码中调用一个CGFloat访问器方法,该代码根据生成的iVar名称生成一个选择器 - (CGFloat) myIVar { return myIVar; } 二传手有形式 - (void) setMyIVar: (CGFloat) p_myIVar { [self willChangeValueForKey: @"myIVar"]; myIVar = p_myIVar; [self didChangeValueForKey: @"my

出于调试目的,我需要从一段代码中调用一个CGFloat访问器方法,该代码根据生成的iVar名称生成一个选择器

- (CGFloat) myIVar {
    return myIVar;
}
二传手有形式

- (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”返回的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”。如果我正确理解了您的需要,这应该比您现在所做的更简单。

您可以将其嵌入nsstring中,然后传递nsstring值……在您必须从nsstring对象获取floatvalue后谢谢您,Mina Nabil-这可能会起作用。我要试一试。如果没有,我将只打开我使用的keyPath枚举,并直接从每个案例调用getter。非常感谢,太棒了!谢谢这个@Firoze Lafeer!很明显,我还有很长的路要走!这就是生意!