Obiektywne metody klasy C a funkcje C
Podczas pracy nad projektem open source natrafiłem na następującą deklarację i implementację funkcji 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
Ten przykład można z łatwością przepisać jako metodę klasy bez żadnego problemu. Jak to jest, używającstringFormMimeType()
parapet wymaga importuFSNData
plik nagłówkowy i tak.
Patrzeć nadokumenty Apple, stwierdza tylko:
Ponieważ Objective-C opiera się na podstawie ANSI C, można swobodnie łączyć prosty kod C z kodem Objective-C. Co więcej, twój kod może wywoływać funkcje zdefiniowane w interfejsach programowych innych niż Cocoa, takich jak interfejsy biblioteki BSD w / usr / include.
Nie ma wzmianki o tym, kiedy funkcje C powinny faworyzować metody Objective-C.
Jedyną korzyścią, jaką widzę w tym momencie, jest to, że wywołanie powyższej funkcji, w przeciwieństwie do metody klasowej, niektóre wywołania wykonawcze Objective-C zostałyby pominięte. W typowym przypadku użyciaFSNData
, nie dałoby to zauważalnego zwiększenia wydajności dla użytkownika (prawdopodobnie nawet dla programistów) *.
Jakie korzyści istnieją (poza stylem kodowania) dla faworyzowania funkcji C w porównaniu z metodą klasową?
*FSNData
jest używany jako częśćFSNetworking biblioteka, więc wątpię, aby podczas cyklu życia aplikacji były wykonywane tysiące operacji sieciowych.