Thuộc tính chỉ là một cách thuận tiện để truy cập dữ liệu. Vì vậy, khi bạn khai báo thuộc tính @property (nonatomic, giữ lại) SomeType * someObject; điều này có nghĩa rằng trong truy cập thì sẽ được tổng hợp 2 phương pháp:
getter:
-(SomeType*) someObject {
return someObject;
}
setter
-(void) setSomeObject:(SomeType*) obj {
[someObject release];
someObject = [obj retain];
}
Vì vậy, sự khác biệt chính giữa tài sản và ivars là thuộc tính tự động tạo ra các setter/getter phương pháp (và bạn có thể ghi đè lên chúng). Nhưng khi bạn đang viết someObject = new_val, bạn chỉ cần sao chép tham chiếu đến vị trí bộ nhớ. Không có công việc bổ sung nào được thực hiện ở đó, ngoại trừ một hướng dẫn lắp ráp.
Có một điều nữa cần đề cập: nguyên tử và nonatomic. Với nguyên tử, bộ tổng hợp/getter sẽ đảm bảo rằng toàn bộ giá trị luôn luôn được trả về từ getter hoặc được thiết lập bởi setter, bất kể hoạt động setter trên bất kỳ thread nào khác. Tức là, nếu luồng A ở giữa getter trong khi luồng B gọi setter, một giá trị thực khả thi - một đối tượng tự động, rất có thể - sẽ được trả lại cho người gọi trong A.
Trong trường hợp không phải là không có bảo đảm như vậy được thực hiện. Do đó, nonatomic nhanh hơn đáng kể so với nguyên tử.
Chỉnh sửa: vì vậy nếu bạn có một số biến, được truy cập từ các luồng khác nhau hoặc/và một số công việc bổ sung phải được thực hiện (ví dụ: giữ lại, nâng cao một số cờ ...), thì lựa chọn của bạn là thuộc tính. Nhưng đôi khi bạn có một biến, đó là truy cập rất thường xuyên và truy cập thông qua tài sản có thể dẫn đến một chi phí lớn, bởi vì bộ vi xử lý phải thực hiện nhiều hoạt động hơn để tổng hợp và gọi phương pháp.
Có thể trùng lặp [khi nào tôi nên sử dụng từ khóa tự.] (Http://stackoverflow.com/questions/4080523/when-should-i-use-the-self-keyword) Điều này được hỏi rất thường xuyên, đã làm bạn tìm kiếm trước khi đặt câu hỏi? – zoul