Trong Objective-C id là một typedef:Mục tiêu-C; typedef objc_object thay thế cho id không có con trỏ;
typedef struct objc_object {
Class isa;
} *id;
Vì vậy, tôi có thể tuyên bố (và khởi tạo) một ví dụ biến như thế này:
// using id
id po_one = @"one";
Biên dịch tốt.
Kể từ khi tôi đặt tên cho loại của tôi trong một chương trình riêng và kể từ khi tôi không thích con trỏ ngụ ý trong id typedef Tôi muốn thêm một typedef riêng (với O cho đối tượng) như thế này:
typedef struct objc_object O;
Vì vậy, một biến khai (với khởi tạo) có thể trông giống như:
// using O
O * po_two = @"two";
này biên dịch với một cảnh báo:
khởi tạo từ i ncompatible con trỏ loại
Theo như tôi hiểu typedefs Tôi nghĩ rằng sau này sẽ tương đương với:
// using struct objc_object
struct objc_object * po_three = @"three";
nào một lần nữa biên dịch tốt.
Đó là đáng ngạc nhiên rằng:
po_two = po_one;
po_two = po_three;
cả biên dịch mà không cần cảnh báo.
Vì vậy, tôi đã cố gắng:
typedef struct objc_object * PO;
để xem liệu nó hoạt động mà không báo trước nếu tôi bao gồm con trỏ (là chính xác những điều tôi muốn tránh - vì vậy chỉ vì lý do kiểm tra) để xem liệu một typedef ngoài định nghĩa cấu trúc hoạt động khác với typedef trong định nghĩa cấu trúc (là định nghĩa của id trong trường hợp này).
// using PO
PO po_four = @"four";
Điều đó cũng hoạt động tốt.
Nếu tôi sử dụng:
#define O struct objc_object
dạng một công trình sử dụng O lần nữa biên dịch mà không báo trước.
Nhưng tôi thích sử dụng typedef thay vì xác định bất cứ khi nào có thể.
Tôi đang bối rối. Sự hiểu lầm của tôi với typedefs là gì?
Trình biên dịch nào? – JeremyP
Ngoài ra, bạn có thể sử dụng 'NSObject *' thay vì 'O *', ví dụ: 'NSObject * po_two = @" hai ";', trong hầu hết các trường hợp. –