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));
应用程序崩溃,我不知道该怎么办?
答案 0 :(得分:3)
你有几个问题。
您尚未准备好使用objc_msgSend
。您在格式字符串中使用了错误的格式说明符这一事实是一个红旗。
您的问题文字为backingScaleFactor
,但您的代码为userSpaceScaleFactor
。你想要哪一个?
记录userSpaceScaleFactor
和backingScaleFactor
以返回CGFloat
。在OS X上,CGFloat
是typedef
,float
低于32位,double
低于64位,因此您必须使用%f
格式化{ {1}},而不是CGFloat
。
当您要发送返回%@
,float
或double
的邮件时,如果编译为32位,则必须使用long double
,但objc_msgSend_fpret
如果编译为64位。
您必须始终将objc_msgSend
(或objc_msgSend
)投射到您正在调用的方法类型。
所以,要使这项工作在32位:
objc_msgSend_fpret
使其在64位上运行:
NSScreen *screen = [NSScreen mainScreen];
NSLog(@"%f", ((CGFloat (*)(id, SEL))objc_msgSend_fpret)(screen, @selector(backingScaleFactor)));