在从事开源项目时,我遇到了以下 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()
sillFSNData
无论如何都需要导入头文件。
查看Apple docs,它仅说明:
由于 Objective-C 建立在 ANSI C 的基础上,您可以自由地将直接 C 代码与 Objective-C 代码混合。此外,您的代码可以调用在非 Cocoa 编程接口中定义的函数,例如 /usr/include 中的 BSD 库接口。
没有提到 C 函数何时应该支持 Objective-C 方法。
在这一点上我能看到的唯一好处是调用上述函数,而不是类方法,一些 Objective-C 运行时调用将被跳过。在 的典型用例中FSNData
,这不会显着提升用户(甚至可能对开发人员)的性能*。
偏爱 C 函数而不是类方法有什么好处(除了编码风格)?
*FSNData
被用作FSNetworking库的一部分,所以我怀疑在任何应用程序的生命周期中都会执行成千上万的网络操作。