37
  1. nilであるオブジェクト(ポインター)のメソッドを呼び出す場合(おそらく誰かがそれを初期化するのを忘れたため)、Objective-Cの通常の動作は何ですか?ある種のエラー(セグメンテーション違反、nullポインタ例外...)を生成するべきではありませんか?
  2. これが正常な動作である場合、プログラムが実行時に何らかのエラー/例外を発生させるように(コンパイラを構成することによって)この動作を変更する方法はありますか?

私が話していることをより明確にするために、ここに例があります。

このクラスを持つ:

@interface Person : NSObject {

    NSString *name;

}

@property (nonatomic, retain) NSString *name;

- (void)sayHi;

@end

この実装では:

@implementation Person

@synthesize name;

- (void)dealloc {
    [name release];
    [super dealloc];
}

- (void)sayHi {
    NSLog(@"Hello");
    NSLog(@"My name is %@.", name);
}

@end

プログラムのどこかで私はこれを行います:

Person *person = nil;
//person = [[Person alloc] init]; // let's say I comment this line
person.name = @"Mike";            // shouldn't I get an error here?
[person sayHi];                   // and here
[person release];                 // and here
4

4 に答える 4

67

オブジェクトに送信されたメッセージはnil、Objective-C では完全に受け入れられ、ノーオペレーションとして扱われます。これはエラーではないため、エラーとしてフラグを立てる方法はありません。実際、これは言語の非常に便利な機能である可能性があります。

ドキュメントから:

nil にメッセージを送る

Objective-C では、メッセージを nil に送信することは有効です。実行時にはまったく効果がありません。Cocoa には、この事実を利用するパターンがいくつかあります。メッセージから nil に返される値も有効な場合があります。

  • メソッドがオブジェクトを返す場合、 に送信されるメッセージは( )をnil返します 。次に例を示します。0nil

    Person *motherInLaw = [[aPerson spouse] mother];

    aPersonがでspouseある場合nilmotherが に送信されnil、メソッドが戻りますnil

  • sizeof(void*)メソッドがポインタ型、 a float、 a double、 a long double、または a以下のサイズの整数スカラーを返す場合、 にlong long送信されるメッセージは をnil返します0

  • メソッドが を返す場合、structMac OS X ABI Function Call Guide でレジスタに返されるように定義されているように、 に送信されたメッセージ はデータ構造内のすべてのフィールドに対してnil返されます。0.0他のstruct データ型はゼロで埋められません。

  • メソッドが前述の値型以外のものを返す場合、nil に送信されるメッセージの戻り値は未定義です。

于 2010-04-23T07:33:11.493 に答える
13

Greg Parkerサイトから:

LLVM Compiler 3.0 (Xcode 4.2) 以降を実行している場合

戻り値の型 | を持つ nil へのメッセージ 戻る
64 ビットまでの整数 | 0
long double までの浮動小数点 | 0.0
ポインター | なし
構造体 | {0}
任意の _Complex 型 | {0, 0}
于 2012-02-29T22:45:06.917 に答える
6

明確にする必要があることの1つは、Objective-Cでは、オブジェクトのメソッドを呼び出さずに、オブジェクトにメッセージを送信することです。ランタイムはメソッドを見つけて呼び出します。

Objective-Cの最初のバージョン以来、nilへのメッセージは常にnilを返す安全なno-opでした。この動作に依存するコードはたくさんあります。

于 2010-04-23T08:47:59.270 に答える