Không có câu trả lời cắt và sấy khô. Tuy nhiên, hãy nhớ rằng tối ưu hóa sớm là xấu. Trong Cocoa trên Mac hoặc trên iPhone, việc sử dụng các trình truy cập/thuộc tính được yêu cầu phải tuân thủ KVO. Sự phù hợp của KVO là cần thiết cho dữ liệu cốt lõi và các ràng buộc Cocoa để hoạt động tự động. Trong dữ liệu cốt lõi, nó không chỉ cần thiết để đảm bảo KVO khi sửa đổi các thuộc tính, mà còn khi truy cập chúng. Nó cũng là tốt nhất để sử dụng accessors/properties khi bạn muốn đảm bảo hành vi quản lý bộ nhớ tài sản, đó là để nói, luôn luôn khi thiết lập một ivar sử dụng ký hiệu setter hoặc dot, và tùy thuộc vào mô hình quản lý bộ nhớ bạn làm theo , luôn luôn sử dụng accessors/tài sản khi nhận được một ivar.
Có một số mẫu quản lý bộ nhớ khác nhau. Tất cả những người không bị hỏng đảm bảo rằng một đối tượng được trả về bởi một người truy cập sẽ tồn tại đến ít nhất là kết thúc của phạm vi autorelease hiện hành. Có nghĩa là, hoặc đối tượng được giữ lại một cách rõ ràng và tự động phát hiện trong phạm vi tự động phát hiện hành. Phương pháp được Apple khuyến cáo thực hiện điều này một cách rõ ràng trong bộ thu thập:
- (id)foo {return [[foo retain] autorelease]; }
- (void)setFoo:(id)aFoo {
if(! [aFoo isEqual:foo]) {
[foo release];
foo = [aFoo retain];
}
}
Nó ngụ ý rằng đó là mẫu họ làm theo trong bộ tiếp cận tổng hợp của chúng. Cá nhân, tôi muốn tự động trả lại trong setter:
- (id)foo {return foo;}
- (void)setFoo:(id)aFoo {
[foo autorelease];
foo = [aFoo retain];
}
Điều này tự động lấy lại giá trị cũ trước khi thay thế bằng giá trị mới. Điều này có tác dụng chính xác giống như giữ lại và tự động phát hiện trong bộ khởi động, nhưng yêu cầu đối tượng chỉ được thêm vào một nhóm tự động phát một lần. Hầu hết thời gian nó có một số lượng giữ lại của một và không phải là autoreleased, vì vậy nó sẽ không đi bất cứ nơi nào không có vấn đề gì xảy ra. Nếu thuộc tính được thay thế trong một số mã vẫn đang giữ nó (chẳng hạn như trong một cuộc gọi lại đại biểu), nó sẽ không biến mất khỏi nó. Điều này có nghĩa là việc sử dụng accessors/properties sẽ cho bạn sự tự tin rằng các đối tượng của bạn sẽ xung quanh miễn là bạn cần chúng mà không có một số phần khác của mã giải phóng chúng từ bên dưới bạn.
Lý do cuối cùng và tốt nhất để luôn sử dụng accessors/properties là làm cho một giả thiết ít hơn cho mỗi thuộc tính: rằng có một ivar cơ bản cho thuộc tính đó và có cùng tên (tôi đoán đó là hai giả định) . Có lẽ trong tương lai bạn sẽ muốn thay thế một cây ngà với một người truy cập có nguồn gốc. Ký hiệu thuộc tính sẽ vẫn hoạt động. Có lẽ bạn muốn đặt lại tên cho ngà voi; tài sản sẽ vẫn hoạt động. May mắn thay, tái cấu trúc trong Xcode thường có thể được dựa vào, nhưng tại sao thậm chí còn bận tâm?
Điểm của lập trình hướng đối tượng là sử dụng các giao diện được xác định trên lớp. Không có lý do chính đáng (mặc dù có rất nhiều lý do thành kiến và hợp lý hóa) cho một lớp học bỏ qua giao diện riêng của nó. Mỗi phương pháp ngoại trừ chính người truy cập nên, trong trường hợp chung, đối xử với đối tượng như là bất khả xâm phạm và trạng thái nội bộ của nó là riêng tư. Viết mọi phương thức như thể nó nằm trong một danh mục hoặc trên một phân lớp phụ, và coi ivars là trạng thái riêng, trừ khi thiết kế cụ thể cần trực tiếp bạn làm khác. Có rất nhiều lý do chính đáng để truy cập trực tiếp vào ivars, nhưng chúng được xác định theo từng trường hợp cụ thể.
Tôi tìm thấy một bài đăng tương tự tại đây: http://stackoverflow.com/questions/1051543/should-i-use-self-keyword-properties-in-the-implementation – Jonah