メッセージは、それがオブジェクトを指しているか、または を指しているかに関係なく、常にオブジェクト ポインターにディスパッチされますnil
。さらに、メッセージは実行時に送信されるため、コンパイラはnil_array
実際にそうであるnil
と想定して最適化することはできません。初期化が別のことを行いnil_array
、インスタンスであることが判明した場合はどうなるでしょうか?
つまり、メソッドに引数として渡すすべての式は、渡されるために評価されるため、いかなる種類の短絡も発生しません。遅い関数が実行され、時間がかかるとプログラムのパフォーマンスに影響します。
編集:私はそれのために小さなテストケースを作成しました(空のObjective-Cコマンドラインプログラム)。これを実行してデバッガ コンソールを観察すると、 への 3 つの呼び出しすべてからの出力function_that_takes_a_lot_of_time_to_compute()
が (5 秒間隔で) 表示され、t1
とt3
のtest:
メソッドからの出力のみが表示されることがわかります。これらは ではないため、当然のことnil
です。
main.m
#import "Test.h"
int function_that_takes_a_lot_of_time_to_compute(void)
{
static int i = 1;
sleep(5);
NSLog(@"%d", i);
return i++;
}
int main(int argc, const char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Test *t1 = [[Test alloc] init], *t2 = nil, *t3 = [[Test alloc] init];
[t1 test:function_that_takes_a_lot_of_time_to_compute()];
[t2 test:function_that_takes_a_lot_of_time_to_compute()]; // nil
[t3 test:function_that_takes_a_lot_of_time_to_compute()];
[t1 release];
[t3 release];
[pool drain];
return 0;
}
Test.h
@interface Test : NSObject {}
- (void)test:(int)arg;
@end
Test.m
@implementation Test
- (void)test:(int)arg
{
NSLog(@"Testing arg: %d", arg);
}
@end
出力
1
テスト引数: 1
2
3
テスト引数: 3