web-dev-qa-db-ja.com

初期化されていないオブジェクト(nullポインター)でメソッドを呼び出す

  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
35
Florin

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

docs から:

nilへのメッセージの送信

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

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

    _Person *motherInLaw = [[aPerson spouse] mother];_

    aPersonspousenilの場合、mothernilに送信され、メソッドはnilを返します。

  • メソッドがポインタ型を返す場合、サイズがsizeof(void*)floatdouble、_long double_、または_long long_の場合、nilに送信されたメッセージは_0_を返します。

  • Mac OS X ABI関数呼び出しガイドで定義されているように、メソッドがレジスタに返されるstructを返す場合、nilに送信されるメッセージは、のすべてのフィールドに対して_0.0_を返します。データ構造。他のstructデータ型はゼロで埋められません。

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

63
Rob Keniger

から グレッグパーカーサイト

LLVMコンパイラ3.0(Xcode 4.2)以降を実行している場合

戻り値の型でnilへのメッセージ| return 
 64ビットまでの整数| 0 
浮動小数点からlongdoubleまで| 0.0 
ポインタ| nil 
構造体| {0} 
任意の_Complexタイプ| {0、0} 
13
Heath Borders

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

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

6
NSResponder