Sau khi đọc một bài báo có tên khiêm tốn "Các điều răn về quy tắc: Thực tiễn tốt nhất cho mã hóa mục tiêu-C" của Robert McNally cách đây chưa đầy hai năm, tôi đã áp dụng cách sử dụng các thuộc tính cho hầu hết mọi thành viên dữ liệu của các lớp Objective-C của tôi ( điều răn thứ 3 tính đến tháng năm 2012). McNally liệt kê những lý do để làm như vậy (nhấn mạnh của tôi):
- Thuộc tính thi hành các hạn chế truy cập (chẳng hạn như chỉ đọc)
- Thuộc tính thi hành chính sách quản lý bộ nhớ (mạnh, yếu)
- Các thuộc tính cung cấp cơ hội để thực hiện trong suốt setters và getters tùy chỉnh.
- Các thuộc tính với setters hoặc getters tùy chỉnh có thể được sử dụng để thực thi chiến lược an toàn luồng.
- Có một cách duy nhất để truy cập các biến thể hiện làm tăng khả năng đọc mã.
Tôi đặt hầu hết các tài sản của mình trong các danh mục riêng tư, vì vậy số 1 và 4 thường không phải là vấn đề tôi gặp phải. Đối số 3 và 5 là 'mềm' hơn, và với các công cụ phù hợp và các tính nhất quán khác, chúng có thể trở thành không vấn đề. Vì vậy, cuối cùng, với tôi, người có ảnh hưởng nhất trong số các đối số này là số 2, quản lý bộ nhớ. Tôi đã làm điều này từ bao giờ.
@property (nonatomic, strong) id object; // Properties became my friends.
Đối với một vài dự án cuối cùng của tôi, tôi đã chuyển sang sử dụng ARC, điều này khiến tôi nghi ngờ liệu việc tạo các thuộc tính cho hầu hết mọi thứ vẫn là một ý tưởng hay hoặc có thể hơi thừa. ARC chăm sóc bộ nhớ quản lý các đối tượng Objective-C cho tôi, hầu hết strong
các thành viên đều hoạt động tốt nếu bạn chỉ khai báo các ivars. Các loại C bạn phải quản lý thủ công bằng mọi cách, trước và sau ARC và các weak
thuộc tính chủ yếu là loại công khai.
Tất nhiên tôi vẫn sử dụng các thuộc tính cho bất cứ thứ gì cần truy cập từ bên ngoài lớp, nhưng chúng hầu hết chỉ là một số thuộc tính, trong khi hầu hết các thành viên dữ liệu được liệt kê dưới dạng ngà dưới tiêu đề triển khai
@implementation GTWeekViewController
{
UILongPressGestureRecognizer *_pressRecognizer;
GTPagingGestureRecognizer *_pagingRecognizer;
UITapGestureRecognizer *_tapRecognizer;
}
Như một thử nghiệm tôi đã thực hiện việc này chặt chẽ hơn một chút và việc tránh xa các thuộc tính cho mọi thứ có một số tác dụng phụ tích cực tốt.
- Yêu cầu mã thành viên dữ liệu (
@property
/@synthesize
) thu nhỏ lại chỉ để khai báo ivar. - Hầu hết các
self.something
tài liệu tham khảo của tôi làm sạch lên chỉ_something
. - Thật dễ dàng phân biệt thành viên dữ liệu nào là riêng tư (ivars) và công khai (thuộc tính).
- Cuối cùng, "cảm giác" giống như đây là mục đích mà Apple dành cho các mục đích, nhưng đó là suy đoán chủ quan.
Đối với câu hỏi : Tôi đang dần trượt về phía bóng tối, sử dụng các thuộc tính ngày càng ít hơn để ủng hộ việc triển khai. Bạn có thể cung cấp cho tôi một chút lý do tại sao tôi nên sử dụng các thuộc tính cho tất cả mọi thứ, hoặc xác nhận dòng suy nghĩ hiện tại của tôi về lý do tại sao tôi nên sử dụng nhiều ngà hơn và ít tài sản hơn khi cần thiết? Câu trả lời thuyết phục nhất cho cả hai bên sẽ nhận được điểm của tôi.
EDIT: McNally cân nhắc trên Twitter, nói : "Tôi nghĩ lý do chính của tôi để gắn bó với tài sản là: một cách để làm mọi thứ, đó là làm mọi thứ (bao gồm KVC / KVO.)"