【问题标题】:Can I rely on nil UIView returning CGRectZero for its frame?我可以依靠 nil UIView 为其框架返回 CGRectZero 吗?
【发布时间】:2012-12-14 08:48:53
【问题描述】:

是的,我看到了:

如果方法返回一个结构体,如 Mac OS X ABI 函数调用指南所定义的那样,将在寄存器中返回,那么发送到 nil 的消息会为结构体中的每个字段返回 0.0。其他结构数据类型不会用零填充。

我只是不明白。

【问题讨论】:

    标签: objective-c ios


    【解决方案1】:

    如果您使用的是最新版本的 LLVM 编译器(Xcode 4.2 或更高版本),那么可以,使用结构返回方法向nil 发送消息将产生一个零填充结构。对于CGRect,这意味着一个矩形等于CGRectZero。

    来源:Greg Parker,他在 Apple 的 ObjC 运行时工作。

    【讨论】:

    • 查看我在问题中引用的文档。它来自官方的 The Objective-C Programming Language。您可以看到它已经声明返回的结构将被零填充,但仅限于那些“由 Mac OS X ABI 函数调用指南定义的在寄存器中返回”。我不确定上面的推文是什么意思。这是否意味着任何结构现在都将被零填充,包括那些“过去不会用零填充的其他结构数据类型”?
    • 是的;过去,在大多数情况下,消息传递 nil 不会返回填充零的结构,除非在幸运的情况下,结构返回值的 ABI 将在寄存器中传递。 (仅适用于非常小的结构。)基于堆栈的返回值不是零填充的。但是使用 Xcode 4.2 或更高版本中的 LLVM 编译器,它们现在总是零填充。
    • 除了上面的推文之外,它还在 WWDC 2011 的一个会议中被提及。
    • 是否有一些地方描述了它是如何在下面工作的?编译器在调用objc_msgSend_stret之前是否将内存归零?
    • 基于@gparker 的博客 (sealiesoftware.com/blog/archive/2012/2/29/…) 上的一篇文章,“如果直接调用 objc_msgSend_stret(),则结构返回未定义。”所以是的,这听起来像是编译器在调用之前归零。
    猜你喜欢
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    相关资源
    最近更新 更多