Trong khi làm việc trên dự án mã nguồn mở, tôi đã xem qua phần khai báo hàm C sau đây và thực hiện:Objective C Lớp Phương pháp vs Chức năng 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
Ví dụ này có thể dễ dàng được viết lại như một phương pháp trình độ lớp với ra bất kỳ vấn đề. Do đó, mặc dù vậy, việc sử dụng bất kỳ yêu cầu stringFormMimeType()
nào cũng sẽ yêu cầu nhập tệp tiêu đề FSNData
.
Nhìn vào the Apple docs, nó chỉ nói:
Bởi vì Objective-C dựa trên một nền tảng của ANSI C, bạn có thể tự do intermix thẳng mã C với mã Objective-C. Hơn nữa, mã của bạn có thể gọi các hàm được định nghĩa trong các giao diện không phải là cacao lập trình, chẳng hạn như làm giao diện thư viện BSD trong/usr/include.
Không có đề cập đến thời điểm các hàm C nên ưu tiên các phương pháp Objective-C.
Lợi ích duy nhất tôi có thể thấy tại thời điểm này, là gọi hàm trên, trái với phương thức lớp, một số (các) cuộc gọi thời gian chạy Objective-C sẽ bị bỏ qua. Trong trường hợp sử dụng điển hình của FSNData
, điều này sẽ không mang lại hiệu suất tăng đáng kể về hiệu suất cho người dùng (có thể ngay cả đối với nhà phát triển) *.
Lợi ích nào tồn tại (ngoài kiểu mã hóa) để ưu tiên hàm C trên phương thức lớp?
* FSNData
được sử dụng như một phần của thư viện FSNetworking, vì vậy tôi nghi ngờ sẽ có hàng nghìn khi hàng nghìn hoạt động mạng được thực hiện trong suốt vòng đời của ứng dụng.
Kiểu, lập cấu trúc chương trình (liên kết rõ ràng phương thức với lớp) và một chút kiểm soát truy cập (rất yếu) là tất cả những gì tôi có thể nghĩ đến. (Nhưng tôi thấy rằng @ipmcc đề cập đến thừa kế, và có một vài điều ở đó.) –
Tôi thích phương thức lớp vì các phương thức Objective-C cung cấp tham số có tên, trong đó hàm C không – onmyway133
@ onmyway133 Tôi đã cố gắng tránh xa từ sở thích cá nhân (ví dụ ** khác với kiểu mã hóa **) và tìm kiếm lý do kỹ thuật. –