オープン ソース プロジェクトに取り組んでいるときに、次の C 関数の宣言と実装に出くわしました。
// FSNData.h
NSString *stringForMimeType(MimeType type);
@interface FSNData : NSObject
// All the expected objective-c property and instance method declarations
@end
// FSNData.m
#import "FSNData.h"
// where 'type' is an enum
// this does work as expected
NSString *stringForMimeType(MimeType type) {
switch (type) {
case MimeType_image_jpeg: return @"image/jpeg";
case MimeType_image_png: return @"image/png";
default:
NSLog(@"ERROR: FSNData: unknown MimeType: %d", type);
// do not return "application/octet-stream"; instead, let the recipient guess
// http://en.wikipedia.org/wiki/Internet_media_type
return nil;
}
}
@implementation
// all properties and methods defined in FSData.h implemented as expected
@end
この例は、問題なくクラス レベルのメソッドとして簡単に書き直すことができます。そのままでは、stringFormMimeType()
sillを使用するにはFSNData
ヘッダー ファイルをインポートする必要があります。
Apple docsを見ると、次のようにのみ記載されています。
Objective-C は ANSI C を基盤としているため、ストレート C コードと Objective-C コードを自由に混在させることができます。さらに、/usr/include の BSD ライブラリ インターフェイスなど、非 Cocoa プログラム インターフェイスで定義された関数をコードから呼び出すことができます。
C 関数がどのような場合に Objective-C メソッドを優先するかについては言及されていません。
この時点でわかる唯一の利点は、クラス メソッドとは対照的に、上記の関数を呼び出すと、一部の Objective-C ランタイム呼び出しがスキップされることです。の典型的な使用例ではFSNData
、これによってユーザー (おそらく開発者) のパフォーマンスが大幅に向上することはありません*。
クラス メソッドよりも C 関数を優先することには、(コーディング スタイル以外に) どのような利点がありますか?
*FSNData
はFSNetworkingライブラリの一部として使用されるため、アプリケーションのライフ サイクル中に何千ものネットワーク操作が実行されるとは思えません。