我有一个问题,objc_msgSend调用NSScreen backingScaleFactor函数,但objc_msgSend通过NSLog返回NSScreenAux类型,NSScreen backingScaleFactor应该在文档中返回CGFloat类型,谁有这个问题?
NSScreen *screen = [NSScreen mainScreen];
NSLog(@"%@", objc_msgSend(screen, @selector(userSpaceScaleFactor))NSLog打印"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));应用程序崩溃了,我不知道该怎么办?
发布于 2012-11-20 14:39:24
你有几个问题。
objc_msgSend。您在格式字符串中使用了错误的格式说明符,这是一个危险信号。,
backingScaleFactor,但您的代码显示为userSpaceScaleFactor。你想要哪一个?userSpaceScaleFactor和backingScaleFactor都会返回CGFloat。在OS X上,CGFloat是32位以下的float和64位以下的double的typedef,因此您必须使用%f而不是%@.CGFloat。如果要发送返回float、double或long double的消息,则必须使用objc_msgSend_fpret如果针对32位进行编译,则必须使用objc_msgSend如果针对64位进行编译,则必须使用objc_msgSend。objc_msgSend_fpret)转换为要调用的方法的类型。因此,要使其在32位上工作:
NSScreen *screen = [NSScreen mainScreen];
NSLog(@"%f", ((CGFloat (*)(id, SEL))objc_msgSend_fpret)(screen, @selector(backingScaleFactor)));要使其在64位上工作:
NSScreen *screen = [NSScreen mainScreen];
NSLog(@"%f", ((CGFloat (*)(id, SEL))objc_msgSend)(screen, @selector(backingScaleFactor)));https://stackoverflow.com/questions/13467219
复制相似问题