3

視界の高さを知りたいです。

NSInteger height = view.frame.size.height;

上記のコードでは、framesizeは構造体であり、viewはオブジェクトです。上記のコードで nil の場合、どのような値が
返されますか?viewheight

nil オブジェクトにメッセージを送信すると nil になることがわかっています。
しかしsize、対象ではありません。

view上記のコードを実行すると、 nilの場合は 0 になります。
常に 0 を返しますか、それとも 0 を返すことは保証されていませんか?

次のコードでも、height は 0 を返します。

CGSize size;
NSInteger height = size.height;

Objective-C では、初期化されていない構造体は常にゼロを返しますか?

4

2 に答える 2

7

最初の例 ( ) では、 nil のview.frame.size.height場合は 0 になることが保証されています。viewこれは Xcode 4.2 で真になりました (clang を使用)。古いコンパイラ バージョン (および私が信じている gcc) の場合、結果は未定義です。出典: Greg Parker のブログ.

2 番目の例で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 に答える