Objective c performSelector的结果:与标准点符号调用不同?

Objective c performSelector的结果:与标准点符号调用不同?,objective-c,iphone,Objective C,Iphone,最近我的代码中出现了一些意想不到的编译错误,这让我非常困惑。我进行了一些故障排除,并提出了以下测试代码: 1 float performSelectorResult, messageResult; 2 SEL selector = @selector(smallContentCellMargin); 3 4 NSLog (@"selector %s result %f", selector, [defaults performSelector:selector]); 5 NSLog (@"me

最近我的代码中出现了一些意想不到的编译错误,这让我非常困惑。我进行了一些故障排除,并提出了以下测试代码:

1 float performSelectorResult, messageResult;
2 SEL selector = @selector(smallContentCellMargin);
3
4 NSLog (@"selector %s result %f", selector,  [defaults performSelector:selector]);
5 NSLog (@"message result is %f", defaults.smallContentCellMargin);
6
7 performSelectorResult = [defaults performSelector:selector];
8 messageResult = defaults.smallContentCellMargin;
如果按原样运行代码,则在第7行出现编译错误:“赋值中的不兼容类型”。但是,如果我注释掉第7行,代码将生成并运行;NSLog中的结果是:

2009-07-21 18:31:44.823 ICE[24347:20b] selector smallContentCellMargin result 0.000000
2009-07-21 18:31:44.830 ICE[24347:20b] message result is 7.000000

我使用了非常类似的代码来检索UIFont,但从未使用过浮点。有什么我不知道的吗,或者这是Objective-C中的一个bug?我很困惑。

首先,在使用NSLog登录时,您将选择器视为字符串。不要这样做-SEL不是字符串。使用%@格式和NSStringFromSelector(选择器)

对于手头的问题,-performSelector:定义为与任何具有对象返回类型的选择器一起使用。由于ABI,您可以对指针大小的int返回类型使用它(取决于运行时实现细节),但您通常无法对浮点返回值使用它,正如您所注意到的


对于非对象返回值,应使用NSInvocation或-valueForKey:。在后一种情况下,您将得到一个作为NSNumber装箱的float。

我尝试了对-valueForKey的快速测试:'float quickTest=[defaults valueForKey:@“smallContentCellMargin”];'当我试图编译代码时,我得到一个“初始化中不兼容的类型”错误。我在文档中查找了-valueForKey,它说它返回类型(id)-我是否做错了什么,或者在本例中它与-performSelector相同?+1这是一个很好的机会,可以了解更多有关消息实际传递方式的信息。我们经常说消息是通过objc_msgSend()传递的,但这只是一种简化。在文档中查找objc_msgSend()并将其与它的朋友进行比较,在本例中特别是objc_msgSend_fpret()。请注意,操作代码可以在PPC上工作,但不能在Intel上工作。这就是你不想依赖的平台依赖性。使用Jim的方法,即使是在英特尔上可以逍遥法外的Int。请重新阅读Jim关于-valueForKey:返回NSNumber的评论。NSNumber是一个表示数字的对象(本例中为双精度)。我应该得到尖刻的评论,而不是你平淡的回答!谢谢你,罗布。我错过了NSNumber部分。最后一个提示:谢谢你的NSStringFromSelector提示,Jim!