1) bạn đang xác định mối liên hệ của nó. liên kết bên ngoài cho phép bạn hoặc bất kỳ khách hàng nào tham khảo biểu tượng.
liên quan đến các biến toàn cầu: nếu biến có thể thay đổi và/hoặc cần xây dựng phù hợp, thì bạn nên xem xét các phương pháp hoặc chức năng cho đối tượng này. Ngoại trừ đáng chú ý này được NSString hằng:
// MONClass.h
extern NSString* const MONClassDidCompleteRenderNotification;
// MONClass.m
NSString* const MONClassDidCompleteRenderNotification = @"MONClassDidCompleteRenderNotification";
2) không có trường hợp từ khóa extern ảnh hưởng đến tầm nhìn (công/bảo vệ/private/gói). để sử dụng ký hiệu (ví dụ: hàm hằng số hoặc hàm C), chỉ cần bao gồm tiêu đề được khai báo.
hơi khó hiểu nếu bạn mới sử dụng ngôn ngữ: đặt các khai báo extern C (hằng số, hàm) ở giữa @interface ... @end
sẽ không thay đổi phạm vi của nó:
@interface MONClass : NSObject
extern const size_t MaximumThreads;
@end
có cùng phạm vi (toàn cầu) và tầm nhìn (công cộng) như:
@interface MONClass : NSObject
@end
extern const size_t MaximumThreads;
để nó thực sự làm cho không có ý nghĩa để đặt lớp liên quan hằng C hoặc các chức năng của bạn trong @[email protected]
và @[email protected]
. tôi khuyên bạn nên đặt những trong tiêu đề tương tự như giao diện, bên ngoài @interface/@end
và @implementation/@end
và tiền tố tên với lớp nó gắn liền với, như vậy:
@interface MONClass : NSObject
@end
extern const size_t MONClassMaximumThreads;
// MONClass.m
const size_t MONClassMaximumThreads = 23;
và nếu bạn muốn điều đó liên tục được tin, chỉ cần khai báo và xác định nó như sau:
// MONClass.m
static const size_t MONClassMaximumThreads = 23;
@implementation MONClass
@end
thật không may, không có cách nào đơn giản hoặc phổ biến để bảo vệ liên tục với objc này.
cuối cùng, bạn cũng có thể sử dụng phương pháp lớp nếu số lượng cần thay đổi theo từng lớp:
@interface MONMammal : NSObject
+ (NSUInteger)numberOfLegs;
@end
@implementation MONDog
+ (NSUInteger)numberOfLegs { return 4; }
@end
@implementation MONHuman
+ (NSUInteger)numberOfLegs { return 2; }
@end
3) có, giữa các ngôn ngữ khác. ví dụ: nếu bạn sử dụng extern const int Something
trong bản dịch C++, bản dịch C++ sẽ tìm kiếm Something
được khai báo dưới dạng biểu tượng extern C++. không có sự thay thế trong objc; objc là một superset của C và kế thừa tất cả các chức năng của C. sử dụng extern
cũng được hình thành và bạn cũng có thể tìm thấy nó trong các khuôn khổ mà bạn sử dụng (ví dụ: Foundation). họ sử dụng nó bởi vì họ cần phải xác định liên kết. objc không cung cấp thay thế, có lẽ vì nó không yêu cầu thay thế hoặc gia hạn.
để tránh điều này, bạn chỉ cần sử dụng một #define
như thế này:
#if !defined(__cplusplus)
#define MONExternC extern
#else
#define MONExternC extern "C"
#endif
MONExternC const size_t MONClassMaximumThreads;
Objective-C là một superset của C. Vì vậy, các từ khóa C áp dụng. – Mat
câu hỏi hay .. – Krishnabhadra
@ Tôi biết, nhưng quan điểm của tôi là: không phải khách quan-c cung cấp các từ khóa riêng của mình để khai báo các phương pháp và biến số globals? – aneuryzm