objc_msgSend调用NSScreen backingScaleFactor返回NSScreenAux?

时间:2012-11-20 05:41:18

标签: objective-c

我有一个问题,即objc_msgSend调用NSScreen backingScaleFactor函数,但是objc_msgSend通过NSLog返回NSScreenAux类型,NSScreen backingScaleFactor应该在文件中返回CGFloat类型,任何人都有问题吗?

NSScreen *screen = [NSScreen mainScreen];
NSLog(@"%@", objc_msgSend(screen, @selector(userSpaceScaleFactor))

NSLog print“NSScreenAux:0x1661210”

我有一个新问题。 objc_msgSend调用函数

- (NSRect)convertRectToBacking:(NSRect)aRect NS_AVAILABLE_MAC(10_7);

代码如下:

NSScreen* screen = [NSScreen mainScreen]; 
NSRect rect = NSMakeRect(0, 0, 100, 100); 
NSLog(@" %@ ", objc_msgSend(screen, @selector(convertRectToBacking:), rect));

应用程序崩溃,我不知道该怎么办?

1 个答案:

答案 0 :(得分:3)

你有几个问题。

  1. 您尚未准备好使用objc_msgSend。您在格式字符串中使用了错误的格式说明符这一事实是一个红旗。

  2. 您的问题文字为backingScaleFactor,但您的代码为userSpaceScaleFactor。你想要哪一个?

  3. 记录userSpaceScaleFactorbackingScaleFactor以返回CGFloat。在OS X上,CGFloattypedeffloat低于32位,double低于64位,因此您必须使用%f格式化{ {1}},而不是CGFloat

  4. 当您要发送返回%@floatdouble的邮件时,如果编译为32位,则必须使用long double,但objc_msgSend_fpret如果编译为64位。

  5. 您必须始终将objc_msgSend(或objc_msgSend)投射到您正在调用的方法类型。

  6. 所以,要使这项工作在32位:

    objc_msgSend_fpret

    使其在64位上运行:

    NSScreen *screen = [NSScreen mainScreen];
    NSLog(@"%f", ((CGFloat (*)(id, SEL))objc_msgSend_fpret)(screen, @selector(backingScaleFactor)));