2012-09-15 75 views
3

我想知道視圖的高度。,如果結構沒有初始化,它的成員返回什麼值?

NSInteger height = view.frame.size.height; 

在上面的代碼中,framesize是結構和view是對象。
如果view在上面的代碼中爲零,height返回什麼值?

我知道如果我將消息發送給nil對象,我會得到nil。
size不是對象。

當我運行上面的代碼,我得到0,如果view是零。
它總是返回0,否則返回0不能保證?

也在下面的代碼中,高度返回零。

CGSize size; 
NSInteger height = size.height; 

在Objective-C中,未初始化的結構總是返回零?

回答

7

在您的第一個示例中(view.frame.size.height),如果view爲零,則保證得到0。這在Xcode 4.2中變得真實(使用clang);對於舊的編譯器版本(我相信gcc)結果是未定義的。來源:Greg Parker's blog

對於第二個示例,它取決於在哪裏聲明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; 

(或靜態變量),則是保證被初始化爲零,當你的應用程序啓動。

+0

感謝您的明確答案!是否永久保證view(nil).frame.size.height返回0?這種行爲可能會在未來通過Xcode或編譯器的升級或更改而改變嗎? –

+1

是的,它是有保證的。 –

+0

謝謝!但是,如果可能,你能告訴我爲什麼它有保證嗎? –

2

這不是一個未初始化的結構。實際上,由於這個原因,它被初始化爲全0的objc_msgSend_stret():發送給nil的結構返回消息對於所有成員返回0。