Số 1 khác với hai số kia bằng cách khai báo trước lớp MyOtherObject để giảm thiểu lượng mã được trình biên dịch và trình liên kết nhìn thấy và cũng có khả năng tránh các tham chiếu vòng tròn. Nếu bạn làm theo cách này, hãy nhớ đặt #import vào tệp .m.
Bằng cách khai báo @property, (và khớp với @synthesize trong tệp .m), bạn sẽ tự động tạo các phương thức truy cập với ngữ nghĩa bộ nhớ được xử lý theo cách bạn chỉ định. Quy tắc chung cho hầu hết các đối tượng là Giữ lại, nhưng NSStrings, ví dụ, nên sử dụng Sao chép. Trong khi Singletons và Delegates thường nên sử dụng Assign. Trình truy cập viết tay rất tẻ nhạt và dễ xảy ra lỗi, do đó, điều này giúp tiết kiệm rất nhiều lỗi đánh máy và lỗi câm.
Ngoài ra, việc khai báo một thuộc tính tổng hợp cho phép bạn gọi một phương thức truy cập bằng cách sử dụng ký hiệu dấu chấm như sau:
self.otherObj = someOtherNewObject;
MyOtherObject *thingee = self.otherObj;
Thay vì cách truyền thông thường, thông báo:
[self setOtherObject:someOtherNewObject];
MyOtherObject *thingee = [self otherObj];
Đằng sau hậu trường, bạn thực sự đang gọi một phương thức trông như thế này:
- (void) setOtherObj:(MyOtherObject *)anOtherObject {
if (otherObject == anOtherObject) {
return;
}
MyOtherObject *oldOtherObject = otherObject;
otherObject = [anOtherObject retain];
[oldOtherObject release];
}
… Hoặc cái này
- (MyOtherObject *) otherObject {
return otherObject;
}
Đau toàn bộ ở mông, phải. Bây giờ hãy làm điều đó cho mọi ivar trong lớp. Nếu bạn không làm đúng chính xác, bạn sẽ bị rò rỉ bộ nhớ. Tốt nhất hãy để trình biên dịch thực hiện công việc.
Tôi thấy rằng Số 1 không có ivar. Giả sử đó không phải là lỗi đánh máy, cũng không sao vì chỉ thị @property / @synthesize cũng sẽ khai báo một ivar cho bạn, ở đằng sau hậu trường. Tôi tin rằng điều này là mới cho Mac OS X - Snow Leopard và iOS4.
Số 3 không có các trình truy cập đó được tạo nên bạn phải tự viết chúng. Nếu bạn muốn các phương thức truy cập của mình có các tác dụng phụ, bạn thực hiện điệu nhảy quản lý bộ nhớ tiêu chuẩn, như được hiển thị ở trên, sau đó thực hiện bất kỳ công việc phụ nào bạn cần, bên trong phương thức trình truy cập. Nếu bạn tổng hợp một thuộc tính cũng như viết của riêng bạn , thì phiên bản của bạn sẽ được ưu tiên.
Tôi đã bao gồm tất cả mọi thứ?