2008-08-25 44 views
134

Tôi đang học mục tiêu-c và tiếp tục chạm vào biểu tượng @. Nó được sử dụng trong các kịch bản khác nhau, ví dụ ở đầu chuỗi hoặc để tổng hợp các phương thức truy cập.Biểu tượng @ đại diện cho mục tiêu-c là gì?

Biểu tượng @ có ý nghĩa gì trong mục tiêu-c?

+0

tại sao @ được sử dụng trước khi @ interface và @ kết thúc? –

Trả lời

153

Nhân vật @ không được sử dụng trong C hoặc C định danh ++, vì vậy nó được sử dụng để giới thiệu các từ khóa ngôn ngữ mục tiêu-C theo cách không xung đột với các từ khóa của các ngôn ngữ khác. Điều này cho phép phần "Mục tiêu" của ngôn ngữ tự do xen kẽ với phần C hoặc C++. Vì vậy, với rất ít ngoại lệ, bất cứ lúc nào bạn nhìn thấy @ trong một số mã Objective-C, bạn đang xem xét các cấu trúc Objective-C chứ không phải là cấu trúc C hoặc C++.

Các trường hợp ngoại lệ chính là id, Class, nilNil, thường được coi là từ khóa ngôn ngữ mặc dù họ cũng có thể có một hoặc typedef#define phía sau họ. Ví dụ, trình biên dịch thực sự xử lý id đặc biệt về các quy tắc chuyển đổi kiểu con trỏ nó áp dụng cho các khai báo, cũng như quyết định có tạo các rào cản viết GC hay không.

trường hợp ngoại lệ khác là in, out, inout, oneway, byrefbycopy; chúng được sử dụng làm chú thích lớp lưu trữ trên tham số phương thức và kiểu trả về để làm cho các đối tượng phân tán hiệu quả hơn. (Họ trở thành một phần của chữ ký phương pháp có sẵn từ thời gian chạy, mà DO có thể nhìn vào để xác định làm thế nào để serialize tốt nhất một giao dịch.) Ngoài ra còn có các thuộc tính trong @property tờ khai, copy, retain, assign, readonly, readwrite, nonatomic, gettersetter; chúng chỉ hợp lệ trong phần thuộc tính của tuyên bố @property.

+2

Bạn có thể giải thích điều gì đó về những gì @ (biểu hiện) làm gì không? Đó là mục duy nhất tôi không hiểu trong cửa sổ bật lên được hiển thị khi tôi nhập @ vào xcode. – jchnxu

+6

@ (99) giống với [NSNumber numberWithInteger: 99]. @ (YES) giống với [số NSNumberWithBool: YES]. Dấu @ là lối tắt để tạo đối tượng. – JoJo

+0

'NSLog (@"% @,% @ ", [@ (9) lớp], [@ [@ (1), @ (2)] lớp]);' có đầu ra '__NSCFNumber, __NSArrayI' – Nianliang

58

Từ Objective-C Tutorial: The @ Symbol, lý do nó là trên mặt trước của các từ khóa khác nhau:

Sử dụng @ nên làm cho nó dễ dàng hơn bolt một trình biên dịch Objective-C trên một trình biên dịch C hiện có. Bởi vì @ không hợp lệ trong bất kỳ ngữ cảnh nào trong C ngoại trừ chuỗi ký tự, tokenizer (bước đầu và đơn giản trong trình biên dịch) có thể được sửa đổi để chỉ tìm ký tự @ bên ngoài chuỗi không đổi (tokenizer hiểu chuỗi ký tự , do đó, nó ở một vị trí để phân biệt này). Khi @ gặp phải tokenizer sẽ đặt phần còn lại của trình biên dịch trong "Objective-C mode." (Trình phân tích cú pháp Objective-C sẽ chịu trách nhiệm trả lại trình biên dịch về chế độ C thông thường khi nó phát hiện phần cuối của mã Objective-C).

Ngoài ra khi nhìn thấy trước mặt một chuỗi chữ, nó làm cho một NSString chứ không phải là một 'char *' trong C.

24

Từ Macrumors: Objective-C Tutorial, khi ở phía trước chuỗi chữ:

Ngoài ra còn có @ "" NSString literals. Về cơ bản nó là viết tắt của phương thức + stringWithUTF8String của NSString.

@ cũng thêm hỗ trợ unicode vào chuỗi C.

+11

*" Nó về cơ bản là viết tắt của phương thức + stringWithUTF8String của NSString. "* Vâng, không chính xác. Các chuỗi được phân bổ tĩnh, điều này làm cho chúng khác biệt với '+ [NSString stringWithUTF8String:]' (chúng được phân bổ động), và việc giải phóng và giữ lại không ảnh hưởng đến chúng. –

12

Từ manual:

khung Objective-C thường không sử dụng chuỗi C-phong cách. Thay vào đó, chúng truyền chuỗi xung quanh dưới dạng đối tượng NSString.

Lớp NSString cung cấp một wrapper đối tượng cho các chuỗi có tất cả trong những lợi thế bạn mong chờ, bao gồm xây dựng trong bộ nhớ quản lý để lưu trữ chuỗi tùy ý độ dài, hỗ trợ cho Unicode, tiện ích định dạng printf-phong cách, và hơn. Vì các chuỗi như vậy là được sử dụng phổ biến, Objective-C cung cấp ký hiệu viết tắt cho các đối tượng NSString từ các giá trị không đổi. Để sử dụng viết tắt này, tất cả các bạn phải làm là đi trước một, chuỗi dụng dấu ngoặc kép bình thường với các biểu tượng @, như trong các ví dụ sau:

NSString *myString = @"My String\n"; 
NSString *anotherString = [NSString stringWithFormat:@"%d %@", 1, @"String"]; 
+0

Nhưng đây chỉ là một ví dụ về nơi '@' được sử dụng. Tôi đang nhìn vào mã như thế này: 'mapperOptions = @ {kSTMapperVolumeResolutionKey: @ (volumeResolution),' ... không có gì để làm với NSString – GreenAsJade

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