在Objective-c中,若结构未初始化,则其成员返回什么值



我想知道视图的高度。

NSInteger height = view.frame.size.height;

在上述代码中,framesize是结构,view是对象
如果view在上面的代码中为nil,那么height返回什么值?

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

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

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

CGSize size;
NSInteger height = size.height;

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

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

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

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

则CCD_ 11是未定义的。它可能是零,也可能是任何其他数字。

如果是这样的实例变量:

@implementation MyObject {
    CGSize size;
}

则保证其被CCD_ 12初始化为零。

如果是这样的全局变量:

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

(或静态变量),则保证在应用程序启动时将其初始化为零。

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

最新更新