Biểu tượng @ thể hiện điều gì trong object-c?


141

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

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


tại sao @ được sử dụng trước @interface và @end?
Lalit Kumar

Câu trả lời:


159

@tự này không được sử dụng trong các định danh C hoặc C ++, do đó, nó được sử dụng để giới thiệu các từ khóa ngôn ngữ Objective-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ữ có thể tự do xen kẽ với phần C hoặc C ++.

Do đó, với rất ít ngoại lệ, bất cứ khi nào bạn nhìn thấy @trong một số mã Objective-C, bạn đang xem các cấu trúc Objective-C thay vì các cấu trúc C hoặc C ++.

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

Trường hợp ngoại lệ khác in, out, inout, oneway, byref, và bycopy; chúng được sử dụng như các chú thích lớp lưu trữ trên tham số phương thức và các 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 để sắp đặt tốt nhất một giao dịch.) Ngoài ra còn có các thuộc tính trong @propertytờ khai, copy, retain, assign, readonly, readwrite, nonatomic, getter, và setter; những cái đó chỉ hợp lệ trong phần thuộc tính của một @propertytuyên bố.


4
Bạn có thể giải thích điều gì đó về những gì @ (biểu hiện) làm 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 @ in xcode.
jchnxu

10
@ (99) giống như [NSNumber numberWithInteger: 99]. @ (CÓ) giống như [NSNumber numberWithBool: CÓ]. Dấu @ là một phím tắt để tạo đối tượng.
JoJo

7
Có ai khác bối rối bởi thực tế là "câu trả lời" này không thực sự trả lời câu hỏi đã nêu? Người hỏi nói "'@' nghĩa là gì trong Objective-C?" và người trả lời nói "Điều đó có nghĩa là bạn đang sử dụng Objective-C." Tôi nghĩ rằng anh ấy đã biết nhiều ...
Jon McClung

1
Sắp xếp tùy ý; nó cần phải nằm trong bộ ASCII cơ sở và chưa được C sử dụng khi bộ tiền xử lý Objective-C đầu tiên được viết. Đó là lý do tại sao @.
Chris Hanson

1
Jon McClung: Leo là chính xác, không có ý nghĩa sâu sắc hơn. Ký @tự này không được sử dụng bởi C, do đó, đây là một lối thoát hatch tiện lợi cho việc phân tích cú pháp thay thế cũng bảo tồn 100% khả năng tương thích với mã C hiện có.
Chris Hanson

63

Từ Hướng dẫn Mục tiêu-C: Biểu tượng @ , lý do nó nằm ở mặt trước của các từ khóa khác nhau:

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

Ngoài ra, khi được nhìn thấy trước một chuỗi ký tự, nó tạo ra một NSString chứ không phải là một 'char *' trong C.


24

Từ Macrumors: Objective-C Tutorial , khi đứng trước chuỗi ký tự:

Ngoài ra còn có chữ "NSString". Nó chủ yếu là viết tắt cho phương thức + stringWithUTF8String của NSString.

@ Cũng thêm hỗ trợ unicode cho chuỗi C.


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

16

Từ hướng dẫn :

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

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

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

3
Nhưng đây chỉ là một ví dụ về nơi @được sử dụng. Tôi đang xem mã như thế này: mapperOptions = @{ kSTMapperVolumeResolutionKey: @(volumeResolution),... không có gì để làm với NSString
GreenAsJade
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.