2012-03-03 32 views
7

Công ước với các danh mục là bao gồm tiền tố khi mở rộng các lớp của Apple. Ví dụ:Quy ước về tiền tố cho các danh mục có từ ảo thuật là gì?

[string XXDataUsingUTF8]; 

(Vâng, đó là một ví dụ ngu ngốc Chỉ cần đi với nó..)

Những gì tôi đang chưa rõ ràng trên là những gì quy ước là khi định bắt đầu với copy, set, init hoặc new.

Ví dụ:

[request setHTTPBodyWithKeyValues: keyValues]; 

Nếu tôi thêm tiền tố của tôi, điều này không còn theo "setters bắt đầu với bộ" ước.

[request XXSetHTTPBodyWithKeyValues: keyValues]; 

Mặt khác, nếu tôi thêm các tiền tố sau khi thiết lập, nó không còn thực sự là một tiền tố:

[request setXXHTTPBodyWithKeyValues: keyValues]; 

Đây không phải là khủng khiếp nhập với set, nhưng tôi nghĩ nó càng trở nên quan trọng với init, copy, v.v.

Apple có ghi lại điều này ở bất kỳ đâu không? Có gì sử dụng phổ biến?

+2

Tôi đã không nhìn thấy bất kỳ hướng dẫn chính thức về vấn đề này, nhưng vì lợi ích của không gây nhầm lẫn ARC hoặc máy phân tích tĩnh LLVM, hoặc bất kỳ khác công cụ hoặc con người đọc mã của bạn, tôi sẽ chọn không giữ nguyên tiền tố thông thường ở đầu bộ chọn. Cá nhân, tôi sử dụng dấu gạch dưới trong tên phương thức mở rộng danh mục, vì các phương thức "thực" không bao giờ chứa một phương thức, do đó duy trì tính duy nhất của "tiền tố". Trong ví dụ của bạn sẽ là 'setXX_HTTPBodyWithKeyValues:'. Trong các phương thức mở rộng không dựa trên quy ước, nó chỉ trở thành 'XX_myMethodName'. – pmdj

+0

Tôi đoán đây thực sự là câu trả lời * thực tế * duy nhất, phải không? Cảm ơn bạn đã chỉ ra điều hiển nhiên. :) –

+1

Điểm rất thú vị! Một số người thích postfix chuỗi "namespace" của họ: 'setHTTPBodyWithKeyValues_XX:' không có gì đẹp hơn. –

Trả lời

11

Bạn có thể thiết lập các gia đình phương pháp một cách rõ ràng trong tuyên bố giao diện:

@interface NSObject (StevenFisherCategory) 

- (NSData *)XXCopyDataUsingUTF8 __attribute__((objc_method_family(copy))); 

@end 
+0

Đây là một điểm tuyệt vời. Điều này chắc chắn là cách tiếp cận để sử dụng trong tương lai với Xcode 4.3 và sau đó sử dụng LLVM, đặc biệt là với ARC. –

+1

Câu trả lời hay. Đã cố gắng tìm ra cách để có được phương pháp init tiền tố của tôi để làm việc. '' '__attribute __ ((objc_method_family (init)))' '' đã làm thủ thuật – edelaney05

Các vấn đề liên quan