私が話していることをより明確にするために、ここに例があります。
このクラスを持つ:
@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
nil
オブジェクトに送信されたメッセージは、Objective-Cで完全に受け入れられ、no-opとして扱われます。エラーではないため、エラーとしてフラグを立てる方法はありません。実際、言語の非常に便利な機能である可能性があります。
docs から:
nilへのメッセージの送信
Objective-Cでは、メッセージをnilに送信することは有効です。これは、実行時に効果がないだけです。ココアには、この事実を利用するいくつかのパターンがあります。メッセージからnilに返される値も有効な場合があります。
メソッドがオブジェクトを返す場合、
nil
に送信されたメッセージは_0
_(nil
)を返します。次に例を示します。_
Person *motherInLaw = [[aPerson spouse] mother];
_
aPerson
のspouse
がnil
の場合、mother
はnil
に送信され、メソッドはnil
を返します。メソッドがポインタ型を返す場合、サイズが
sizeof(void*)
、float
、double
、_long double
_、または_long long
_の場合、nil
に送信されたメッセージは_0
_を返します。Mac OS X ABI関数呼び出しガイドで定義されているように、メソッドがレジスタに返される
struct
を返す場合、nil
に送信されるメッセージは、のすべてのフィールドに対して_0.0
_を返します。データ構造。他のstruct
データ型はゼロで埋められません。メソッドが前述の値型以外のものを返す場合、nilに送信されるメッセージの戻り値は未定義です。
明確にする必要があることの1つは、Objective-Cでは、オブジェクトをメソッドを呼び出すオブジェクトではなく、メッセージを送信するオブジェクトであるということです。ランタイムはメソッドを見つけて呼び出します。
Objective-Cの最初のバージョン以来、nilへのメッセージは常にnilを返す安全なno-opでした。この動作に依存するコードはたくさんあります。