Vấn đề là các danh mục tách biệt về mặt logic với các lớp của chúng và thậm chí được lưu trữ riêng trong tệp nhị phân. Việc thực hiện bên trong là cấu trúc mô tả lớp chứa một mảng các danh sách phương thức ban đầu chỉ chứa danh sách các phương thức được xác định trong khối @implementation
chính. Khi mô-đun trình liên kết ObjC tải các danh mục mới, danh sách phương thức của chúng được thêm vào mảng đó.
Do việc triển khai này, chính các danh mục không có phương tiện truy cập bộ nhớ cho một lớp và do đó không thể sửa đổi nó (nó cũng mở ra câu hỏi phải làm gì khi loại được tải).
Cuối cùng, từ góc độ hợp lý hơn là kỹ thuật, ý tưởng là một danh mục không có bất kỳ 'quyền sở hữu' nào của cấu trúc trong bộ nhớ của một lớp, đơn giản là kết hợp một số phương pháp mới. Để hỗ trợ đầy đủ việc tổng hợp tài sản, cần phải sửa đổi bộ nhớ của lớp theo cách nào đó
Giải pháp? Bạn có thể đặt các câu lệnh @synthesize bên trong khối @implementation chính của bạn hoặc bạn chỉ thực hiện trực tiếp các trình truy cập của riêng bạn trong danh mục @implementation.
Nguồn
2009-05-18 21:26:35
Hãy để tôi cụ thể hơn. Tôi đã chia nhỏ một số phương thức thành một danh mục cho mục đích tổ chức và vì tôi sở hữu lớp, tôi đã thêm các iVars thích hợp vào giao diện lớp học. Nhưng tôi vẫn không thể @ lồng ghép các phương thức trong danh mục. Có lý do kỹ thuật nào không? Tôi vẫn không thấy. –
Điều đó không thực sự tạo ra sự khác biệt lớn. Thực tế là bạn là tác giả của cả lớp và danh mục không được mã hóa bởi thời gian chạy theo bất kỳ cách nào, vì vậy danh mục vẫn chỉ là một thực thể riêng biệt không có kết nối với các bộ lưu trữ của lớp mà nó tham chiếu. Giống như tôi đã nói, đó là một cơ chế 'bảo vệ' - bạn chỉ cần @synthesize các biến bên trong khối @implementation chính cho lớp (hoạt động tốt cho tôi). –