Ý nghĩa của id là gì?


97

Tôi đang (cố gắng) học Objective-C và tôi tiếp tục bắt gặp một cụm từ như:

-(id) init;

Và tôi hiểu idlà một từ khóa ngôn ngữ Objective C, nhưng nó có nghĩa là gì khi nói "trình biên dịch xử lý cụ thể idvề các quy tắc chuyển đổi kiểu con trỏ"?

idtự động chỉ định đối tượng ở bên phải của nó làm con trỏ không?


28
Nó đối lập với bản ngã. Đối với một số người đó làvoid*
Hot Licks

Đây là một cuộc thảo luận liên quan đến câu hỏi: câu hỏi SO
Dmitri

Câu trả lời:


122

idlà một con trỏ tới bất kỳ kiểu nào, nhưng không giống như void *nó luôn trỏ đến một đối tượng Objective-C. Ví dụ: bạn có thể thêm bất kỳ loại nào idvào một NSArray, nhưng các đối tượng đó phải đáp ứng retainrelease.

Trình biên dịch hoàn toàn vui lòng cho bạn truyền ngầm bất kỳ đối tượng nào tới idvà bạn có thể truyền idtới bất kỳ đối tượng nào. Điều này không giống như bất kỳ quá trình đúc ngầm nào khác trong Objective-C và là cơ sở cho hầu hết các loại thùng chứa trong Cacao.


11
Bổ sung: id định nghĩa của là typedef struct objc_object *id;, vì vậy nó trỏ đến một Objcđối tượng.
zhongwuzw

nó giống với NSObject? nghĩa là, tôi có thể thay thế idbằng NSObjectkhi đó là kiểu trả về không?
ThunderWiring


33

idlà một con trỏ đến bất kỳ đối tượng Objective-C nào ( objc_object). Nó không chỉ là một con trỏ void và bạn không nên coi nó như vậy. Nó tham chiếu đến một đối tượng phải có một isacon trỏ hợp lệ . Các giá trị có thể được lưu trữ idcũng không chỉ giới hạn ở NSObjectvà con cháu của nó, điều này bắt đầu có ý nghĩa về sự tồn tại của NSObjectgiao thức cũng như NSProxylớp thậm chí không kế thừa từ đó NSObject. Trình biên dịch sẽ cho phép bạn gán một đối tượng được tham chiếu theo kiểu idcho bất kỳ kiểu đối tượng nào, gán bất kỳ kiểu đối tượng nào id, cũng như gửi cho nó bất kỳ thông báo nào (mà trình biên dịch đã nhìn thấy) mà không cần cảnh báo.


25

idlà một loại chung chung. Điều này có nghĩa là trình biên dịch sẽ mong đợi bất kỳ loại đối tượng nào ở đó và sẽ không thực thi các hạn chế. Nó có thể hữu ích nếu bạn muốn sử dụng nhiều hơn một lớp đối tượng ở đó; sau đó bạn có thể sử dụng xem xét nội tâm để tìm ra nó thuộc lớp nào. idtự động giả định một con trỏ, vì tất cả các đối tượng trong Objective-C đều được chuyển dưới dạng con trỏ / tham chiếu.

Một số nguồn bổ sung:
id vs NSObject vs id *
Objective-C Programming (Wikibooks)
Mẫn
động Typing


9
  • id là một kiểu dữ liệu của mã định danh đối tượng trong Objective-C, có thể được sử dụng cho một đối tượng thuộc bất kỳ loại nào bất kể nó có lớp nào. id là siêu loại cuối cùng của tất cả các đối tượng.

Trong java hoặc c #, chúng tôi sử dụng như thế này

 Object data = someValue;


 String name =(Object)data;

nhưng trong mục tiêu c

id data= someValue;



NSString *name= data;

5

Có và không. Đúng là việc id xchỉ định x làm con trỏ, nhưng nói rằng các quy tắc chuyển đổi kiểu con trỏ được áp dụng là sai vì "id" có các quy tắc chuyển đổi kiểu đặc biệt. Ví dụ: với một void *con trỏ, bạn không thể làm điều này:

void *x;
char *y = x; // error, this needs an explicit cast

Ngược lại, có thể với id:

id x;
NSString *y = x;

Xem thêm cách sử dụng id loại trong các ví dụ mục tiêu c .

Ngoài Objective C "hiện đại", nó được ưu tiên sử dụng instancetypethay vì "id" trên các phương thức "init". Thậm chí có một công cụ chuyển đổi tự động trong Xcode để thay đổi điều đó. Đọc về instancetype: Sẽ có lợi nếu bắt đầu sử dụng instancetype thay vì id?

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.