2009-05-18 34 views
7

Obj-C 2.0 cho phép tôi khai báo các thuộc tính trong một danh mục, nhưng trình biên dịch từ chối tổng hợp các trình truy cập bên trong thể loại. Tại sao?Tại sao tôi không thể @ tích hợp người truy cập trong một danh mục?

(Đôi khi nó làm cho tổ chức có ý thức đưa một loạt các nội dung liên quan vào một danh mục - ngay cả khi iVars sao lưu vào trong khai báo lớp. Tôi biết về tiện ích mở rộng lớp học và cách thực hiện các thuộc tính riêng tư, nhưng đó không phải là của tôi trường hợp sử dụng.)

Trả lời

0

Câu hỏi được hỏi có bao gồm vấn đề truy cập riêng. Điều này tiếp cận từ một POV không phải là tư nhân.

9

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.

+0

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. –

+0

Đ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). –

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