2011-11-02 25 views
17
  1. Nếu tôi tuyên bố một tài sản mạnh mẽ, như vậy:Self.iVar có cần thiết cho các thuộc tính mạnh mẽ với ARC không?

    @property (strong, nonatomic) UIView *iVar; 
    

    Khi tôi đặt nó, không vấn đề gì nếu tôi làm iVar = ... hoặc self.iVar = ...? Có vẻ như với ARC, họ cũng làm như vậy.

  2. Nếu tôi chỉ khai báo biến dụ (không phải là @property), ví dụ, BOOL selected, điều đó có nghĩa là nó suy ra được __unsafe_unretained (vì không có tài sản quy định cụ thể nó trở nên mạnh mẽ), hoặc tôi phải chỉ định rõ ràng điều đó không?

Có vẻ như tôi có thể đã trả lời các câu hỏi của chính tôi ở trên để trả lời ARC: How to release static variable?, nhưng tôi vẫn hơi nhầm lẫn với các câu hỏi trên.

Trả lời

20

Từ góc độ quản lý bộ nhớ, sử dụng ivar = ... hoặc self.property = ... (lưu ý: có không có điều đó như self.ivar) đều giống nhau. Tuy nhiên, việc sử dụng ivar = ... sẽ không gọi hàm setter trong khi self.property = ... thực hiện. Điều này có 3 nhánh quan trọng, không theo thứ tự cụ thể:

  1. Nếu thuộc tính không được đánh dấu nonatomic, thì truy cập vào ivar cơ bản sẽ không lấy khóa và bạn sẽ phá vỡ ý nghĩa nguyên tử.
  2. Nếu thuộc tính bị ghi đè, bởi bạn hoặc bởi một phân lớp, bộ chọn ghi đè sẽ không được gọi.
  3. Thông báo KVO sẽ không được gửi.

Để chỉ khai báo ivar, nó có cùng ngữ nghĩa quản lý bộ nhớ như khai báo biến cục bộ. Đây là tài liệu trong tài liệu section 4.4 of the Objective-C Automatic Reference Counting, nhưng về cơ bản, nếu đó là một đối tượng, nó sẽ được suy ra là __strong.

+0

@kaka: Không. Số lượt truy cập tầm thường: gán một cấu trúc lớn hơn một từ duy nhất gần như chắc chắn không phải nguyên tử bất kể ARC/MRR. –

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