Во время работы над над проектом с открытым исходным кодом, я наткнулся на следующее объявление функции C и реализации:Объективные методы класса C против функций 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()
требует импорта файла заголовка FSNData
в любом случае.
Глядя на the Apple docs, говорится только:
Поскольку Objective-C лежит на фундаменте ANSI C, вы можете свободно смешиваться прямой код C с кодом Objective-C. Более того, ваш код может вызывать функции, определенные в программных интерфейсах, отличных от Cocoa, таких как , поскольку библиотека BSD взаимодействует в/usr/include.
Нет упоминания о том, когда функции C должны поддерживать методы Objective-C.
Единственное преимущество, которое я могу видеть на этом этапе, заключается в том, что вызов вышеуказанной функции, в отличие от метода класса, будет пропущен некоторый вызов (ы) выполнения Objective-C. В типичном случае использования FSNData
это не даст заметного повышения производительности для пользователя (возможно, даже для разработчиков) *.
Какая польза существует (кроме стиля кодирования) в пользу функции C над методом класса?
* FSNData
используется как часть библиотеки FSNetworking, поэтому я сомневаюсь, что в течение любого жизненного цикла приложения будут выполняться тысячи и тысячи сетевых операций.
Стиль, структурирование программы (явно ассоциирование метода с классом) и небольшой (очень слабый) контроль доступа - все, о чем я могу думать. (Но я вижу, что @ipmcc упоминает наследование, и там есть несколько вещей.) –
Я предпочитаю метод класса, потому что методы Objective-C предлагают именованный параметр, функции C которого не являются – onmyway133
@ onmyway133 Я специально старался держаться подальше от личных предпочтений (т. е. ** кроме стиля кодирования **) и ищет техническую причину. –