2

この記事http://www.gnustep.org/resources/ObjCFun.htmlは次のように述べています

その時間が重要な場合はいつでも、Objective-C でメッセージをその実装に事前にバインドして、コストのかかるメッセージ ルックアップを回避することができます。

この事前バインディングをどのように行うのですか?これはセレクターに関するものではありませんね。

4

1 に答える 1

3

これには実装が含まれます。以下を検討してください(参照があれば+1インターネット):

NSArray *myReallyLongArrayOf1000items;

for (int i = 0; i < 1000; i++)
    NSLog(@"%@", [myReallyLongArrayOf1000items objectAtIndex:i]);

obj-c ランタイムが-objectAtIndex:タスクの実行方法を正確に調べるには時間がかかります。したがって、コードのブロックを次のように変更すると:

NSArray *myReallyLongArrayOf1000items;

id (*objectAtIndex)(NSArray *, SEL, int) = (typeof(objectAtIndex)) [myReallyLongArrayOf1000items methodForSelector:@selector(objectAtIndex:)];

for (int i = 0; i < 1000; i++)
    NSLog(@"%@", objectAtIndex(myReallyLongArrayOf1000items, @selector(objectAtIndex:), i);

これは C 関数ポインターを使用します。これは、メソッドを呼び出すだけで追加のランタイム コードを実行しないため、objective-c による動的ルックアップよりもはるかに高速です。

欠点としては、コードがすぐに読みにくくなるため、使用する場合は控えめに使用してください。

于 2012-05-25T16:13:13.180 に答える