2011-10-31 20 views

Trả lời

32

__strong có nghĩa là khi chuyển nhượng, giá trị của biểu thức sẽ được giữ lại và được lưu trữ vào giá trị bằng cách sử dụng ngữ nghĩa nguyên thủy. (Để deallocate như một đối tượng, tất cả các bạn phải làm là gán nó nil, đối tượng tham chiếu trước đó sẽ được phát hành, nil sẽ được giữ lại, mà hiệu quả không có gì và nó đào và kem.)

__unsafe_unretained__weak cũng tương tự như trong ý nghĩa rằng địa chỉ của rvalue sẽ được gán cho lvalue, nhưng nếu bạn sử dụng vòng loại __weak, hoạt động này được đảm bảo là nguyên tử và tuân theo một số ngữ nghĩa khác nhau. Một trong số đó là nếu đối tượng đang được gán hiện đang trải qua deallocation, thì nhiệm vụ sẽ đánh giá là nil và sau đó sẽ được lưu trữ nguyên tử trở lại giá trị của biểu thức. Do đó, từ ngữ __unsafe_unretained, bởi vì hoạt động đó thực sự không an toàn và không được giải quyết.

__autoreleasing giống như __strong ngoại trừ nó có một cảnh báo trước: Đối tượng được giữ được đẩy vào nhóm tự động trả lời hiện tại, do đó bạn có thể lấy quyền sở hữu tạm thời đối tượng để xóa khỏi bộ sưu tập rồi trả lại cho người gọi . Có những cách sử dụng khác cho điều này, nhưng chúng hầu như phải làm với việc sở hữu tạm thời một đối tượng.

Những hành vi này cũng thể hiện bản thân trong các công cụ sửa đổi thuộc tính tương ứng (strong, unsafe_unretainedweak).

Xem EDIT Clang Automatic Reference Counting Technical Specification

: Đối với những iOS không nhắm mục tiêu 5 và do đó không thể gặt hái những lợi ích của __weak, Mike Ash wrote a superb article (và thực hiện) trên zeroing tài liệu tham khảo yếu mà bạn có thể sử dụng để thay thế.

+0

Làm thế nào để bạn làm cho đối tượng 'unsafe__unretain' an toàn hơn? Ý tôi là, nếu nó không được chuyển thành 'nil' tự động bởi trình biên dịch thì chúng ta nên xử lý đối tượng lơ lửng như thế nào? –

+0

@MohammadAbdurraafay Bạn có thể sử dụng '__weak' trong trường hợp đó ... –

+0

Nếu tôi không sai' __weak' không có trong các phiên bản iOS sau này, thì trong trường hợp đó tôi sẽ làm cho đối tượng 'unsafe__unretain' an toàn hơn, không được đặt thành 'nil' tự động? –

4

Mạnh mẽ yêu cầu ARC giữ lại tài sản.

@property (strong,nonatomic) NSObject *object; 
@property (retain,nonatomic) NSObject *object; 

Yếu về cơ bản được gán, tài sản không được lưu giữ. Ngoại trừ khi đối tượng được deallocated con trỏ yếu được tự động thiết lập để nil.

@property (weak,nonatomic) NSObject *object; 
@property (assign,nonatomic) NSObject *object; 

Điểm yếu chỉ khả dụng trên iOS 4.3 trở lên. Nếu bạn muốn nhắm mục tiêu iOS 4.2, bạn cần phải sử dụng unsafe_unretained, điều đó sẽ hoạt động chính xác như được chỉ định.

+0

Trên Mac OS X, 'weak' chỉ khả dụng kể từ Lion; lời khuyên cho iOS 4.2 của bạn cũng được sử dụng cho Snow Leopard. –

+0

@NJones, tôi có một câu hỏi. Làm thế nào trên trái đất có thể 'yếu' là' nonatomic'? 'weak' * theo định nghĩa * là' nguyên tử'. –

+0

@JacobRelkin. Đó là một câu hỏi hay. Tôi sẽ giả định rằng nonatomic là belied bởi yếu modifier.Nhưng đó là cách nó được thực hiện; Chỉ cần kiểm tra tôi đã bắt đầu một dự án Xcode mới, thêm một nhãn, và sau đó kết nối một ổ cắm đủ chắc chắn nó đã cho tôi '@property (yếu, nonatomic) IBOutlet UILabel * nhãn;'. – NJones

1

Loại vòng loại là __autoreleasing, __strong, __unsafe_unretained__weak. Công cụ sửa đổi thuộc tính là strong, unsafe_unretainedweak.

Hãy xem section 4 of Automatic Reference Counting trong tài liệu LLVM/Clang.

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