3

我想知道视图的高度。

NSInteger height = view.frame.size.height;

在上面的代码中,frameandsize是结构体,并且view是对象。
如果view上述代码中为 nil,则height返回什么值?

我知道如果我向 nil 对象发送消息,我会得到 nil。
size不是对象。

当我运行上面的代码时,如果view为零,我得到 0。
它总是返回 0,还是不能保证返回 0?

同样在以下代码中,高度返回零。

CGSize size;
NSInteger height = size.height;

在 Objective-C 中,未初始化的结构总是返回零?

4

2 回答 2

7

在您的第一个示例 ( view.frame.size.height) 中,如果view为 nil,则保证您得到 0。这在 Xcode 4.2 中实现了(使用 clang);对于较旧的编译器版本(和我相信的 gcc),结果是未定义的。资料来源:格雷格·帕克的博客

对于您的第二个示例,这取决于CGSize size;声明的位置。如果它是这样的局部变量:

- (void)someMethod {
    CGSize size;
    NSInteger height = size.height;
    ...
}

然后height是未定义的。它可能是零,也可能是任何其他数字。

如果它是这样的实例变量:

@implementation MyObject {
    CGSize size;
}

那么它保证被初始化为零+[MyObject alloc]

如果它是这样的全局变量:

// outside of any method, function, or class variable section
CGSize size;

(或静态变量)然后保证在您的应用启动时初始化为零。

于 2012-09-15T06:29:32.353 回答
2

它不是一个未初始化的结构。事实上,objc_msgSend_stret()正是因为这个原因,它被初始化为全零:结构返回消息发送nil为所有成员返回 0。

于 2012-09-15T05:54:48.870 回答