首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >objc_msgSend call NSScreen backingScaleFactor return NSScreenAux?

objc_msgSend call NSScreen backingScaleFactor return NSScreenAux?
EN

Stack Overflow用户
提问于 2012-11-20 13:41:18
回答 1查看 475关注 0票数 0

我有一个问题,objc_msgSend调用NSScreen backingScaleFactor函数,但objc_msgSend通过NSLog返回NSScreenAux类型,NSScreen backingScaleFactor应该在文档中返回CGFloat类型,谁有这个问题?

代码语言:javascript
复制
NSScreen *screen = [NSScreen mainScreen];
NSLog(@"%@", objc_msgSend(screen, @selector(userSpaceScaleFactor))

NSLog打印"NSScreenAux: 0x1661210“

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

代码语言:javascript
复制
- (NSRect)convertRectToBacking:(NSRect)aRect NS_AVAILABLE_MAC(10_7);

代码如下:

代码语言:javascript
复制
NSScreen* screen = [NSScreen mainScreen]; 
NSRect rect = NSMakeRect(0, 0, 100, 100); 
NSLog(@" %@ ", objc_msgSend(screen, @selector(convertRectToBacking:), rect));

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

EN

回答 1

Stack Overflow用户

发布于 2012-11-20 14:39:24

你有几个问题。

  1. 您尚未准备好使用objc_msgSend。您在格式字符串中使用了错误的格式说明符,这是一个危险信号。

  1. ,您的问题文本显示为backingScaleFactor,但您的代码显示为userSpaceScaleFactor。你想要哪一个?
  2. userSpaceScaleFactorbackingScaleFactor都会返回CGFloat。在OS X上,CGFloat是32位以下的float和64位以下的doubletypedef,因此您必须使用%f而不是%@.
  3. When来格式化CGFloat。如果要发送返回floatdoublelong double的消息,则必须使用objc_msgSend_fpret如果针对32位进行编译,则必须使用objc_msgSend如果针对64位进行编译,则必须使用objc_msgSend
  4. 必须始终将D28(或objc_msgSend_fpret)转换为要调用的方法的类型。

因此,要使其在32位上工作:

代码语言:javascript
复制
NSScreen *screen = [NSScreen mainScreen];
NSLog(@"%f", ((CGFloat (*)(id, SEL))objc_msgSend_fpret)(screen, @selector(backingScaleFactor)));

要使其在64位上工作:

代码语言:javascript
复制
NSScreen *screen = [NSScreen mainScreen];
NSLog(@"%f", ((CGFloat (*)(id, SEL))objc_msgSend)(screen, @selector(backingScaleFactor)));
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13467219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档