2011-02-12 24 views
7

Objective-C có chỉ thị như:Có thể tạo các chỉ thị tùy chỉnh trong Objective-C không?

  • @ interface
  • @implementation
  • @end
  • @protocol
  • @property
  • @synthesize

Tôi nghĩ của những thứ như marco tinh vi hoặc máy tạo mã. Có thể tạo chỉ thị tùy chỉnh cho mục đích tạo mã không? Một cách sử dụng có thể là tạo ra các phương thức cho CoreData.

Tôi nghĩ không, bởi vì tôi chưa bao giờ thấy bất cứ điều gì về nó, nhưng thế giới của tôi không phải là thế giới.


Câu hỏi của followup:

Jonathan đề cập dưới đây mà chúng ta có thể viết Preprocessor riêng bạn và điều này đặt ra câu hỏi như thế nào. Hiện tại, #define SYMBOLIC_CONSTANT 102 sẽ thay thế tất cả các cá thể của các ký tự SYMBOLIC_CONSTANT bằng các ký tự 102 trong tệp trước khi các tệp chuyển sang trình biên dịch.

Tôi biết nó XCode bạn có thể thêm "Chạy giai đoạn tập lệnh" vào một quá trình xây dựng mục tiêu. Vì vậy, tôi có thể viết một kịch bản để tìm chỉ thị tiền xử lý tùy chỉnh của tôi như '$ coredata' và sau đó có kịch bản tạo một tệp mới với ký tự $ coredata được thay thế bằng một số ký tự mã. Nhưng từ những gì tôi hiểu về quá trình xây dựng của XCode, bạn không thể nạp các file bị thay đổi vào trong pha Compiler Sources. Các tập tin được chỉ định và khóa bởi IDE.

Có ai đã làm điều gì đó tương tự không? Tôi biết nó có thể với hệ thống xây dựng bên ngoài, nhưng thành thật mà nói tôi không ở mức độ hiểu biết đó. Tôi không biết các chi tiết kỹ thuật của những gì xây dựng và chạy nút nào.

Trong thời gian chờ đợi, tôi sẽ bắt đầu đọc Tài liệu XCode của Apple ...

Cảm ơn bạn đã trả lời!

+0

Tôi không nói điều đó dễ dàng từ xa. Tuy nhiên, một cái gì đó giống như '$ coredata' là một mã thông báo tiền xử lý C hợp lệ (' $ 'có thể được sử dụng trong các ký hiệu/tên macro), vì vậy nó có thể được sử dụng trong câu lệnh' # define'. Một lần nữa, mặc dù - nếu bạn cho chúng tôi biết mục tiêu của bạn, chúng tôi có thể đề xuất một cách tiếp cận dễ dàng hơn hoặc tốt hơn cho vấn đề. –

Trả lời

3

Suy nghĩ của bạn là chính xác: không thể thực hiện điều này trong mã của bạn. Cách duy nhất để thêm nhiều hơn @ -directives là thông qua trình biên dịch chính nó. Ngay cả khi bạn đã đi đến tất cả những rắc rối, tôi gần như có thể đảm bảo rằng cú pháp tô sáng hỗ trợ cho họ được mã hóa cứng vào một tập tin cấu hình Xcode ở đâu đó.

Ồ, và nếu bạn đang xem xét việc sử dụng macro tiền xử lý, đó là sự hiểu biết của tôi rằng ký tự @ là bất hợp pháp trong macro tiền xử lý.

Edit: Tôi chạy một kiểm tra, và tôi đúng. Sử dụng ký tự @ trong macro tiền xử lý C là bất hợp pháp. Chúng tuân theo quy tắc giống như tên biến.

+2

Tôi không đề cập đến việc sử dụng macro tiền xử lý. Đọc lại câu trả lời của tôi. –

3

Bạn có nghĩa là trong giới hạn của Mục tiêu-C? Không, vì không có cách nào để nhận ra các từ khóa mới của bạn. Bạn có thể viết một bộ tiền xử lý để phát hiện @whatever và chuyển đổi nó thành mã, nhưng nếu bạn cho chúng tôi biết cụ thể bạn muốn làm gì, chúng tôi có thể đề xuất một cách tiếp cận hiệu quả hơn hoặc tối ưu hơn.

+1

Ký tự @ là bất hợp pháp trong các macro tiền xử lý C. –

+0

Cảm ơn bạn đã phản hồi. Bạn đã cho tôi ý tưởng về cách làm điều này. Quên rằng bạn không cần một móc ngôn ngữ để tạo mã. – Tobias

+2

@Carter: Tôi đã nói * viết một bộ tiền xử lý * không * sử dụng bản inbuilt *. Không phải là tôi muốn sử dụng mã yêu cầu tiền xử lý tùy chỉnh của riêng mình. (Ồ, chờ đã, tôi dùng Objective-C mỗi ngày ...) –

0

Không thể thực hiện được. Đây là những từ khóa được xây dựng trong ngôn ngữ Objective-C. Chỉ vì có một @ ở phía trước chúng không làm cho chúng khác với các từ khóa khác.

5

Trong khi câu trả lời được chấp nhận là đúng, có một giải pháp hack một phần cho loại sự cố này, thư viện libextobjc được áp dụng. Cân nhắc this code, bạn sẽ tìm thấy các định nghĩa như sau đó:

#define weakify(...) \ 
    try {} @finally {} \ 
    metamacro_foreach_cxt(ext_weakify_,, __weak, __VA_ARGS__) 

định nghĩa như vậy cho phép sử dụng weakify từ khóa trong các hình thức sau đây:

id foo = [[NSObject alloc] init]; 
id bar = [[NSObject alloc] init]; 

@weakify(foo, bar); 

Tác giả của thư viện giải thích nó here:

Kể từ khi macro đang dự định sẽ được sử dụng với một @ trước ceding chúng (như @strongify (self);), try {} làm mất đi ký hiệu sao cho nó không gây ra lỗi cú pháp .


Cập nhật sau

From now on libextobjc sử dụng @autoreleasepool để "ngâm lên biểu tượng".

+0

* thở dài, giải thích tuyệt vời với hack-ory khủng khiếp – TheCodingArt

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