Sự khác biệt giữa 'yếu' và 'gán' trong khai báo thuộc tính ủy quyền


87

Sự khác biệt giữa điều này là gì:

@property (nonatomic, weak) id  <SubClassDelegate> delegate; 

và điều này:

@property (nonatomic, assign) id  <SubClassDelegate> delegate; 

Tôi muốn sử dụng tài sản cho các đại biểu.

Câu trả lời:


153

Sự khác biệt duy nhất giữa weakassignlà nếu đối tượng mà một thuộc weaktính trỏ đến được phân bổ, thì giá trị của weakcon trỏ sẽ được đặt thành nil, để bạn không bao giờ gặp rủi ro khi truy cập vào rác. Nếu bạn sử dụng assign, điều đó sẽ không xảy ra, vì vậy nếu đối tượng được phân bổ từ bên dưới bạn và bạn cố gắng truy cập nó, bạn sẽ truy cập rác.

Đối với các đối tượng Objective-C, nếu bạn đang ở trong một môi trường mà bạn có thể sử dụng weak, thì bạn nên sử dụng nó.


16
Bạn có biết tại sao một số lớp khuôn khổ Cocoa Touch vẫn đang sử dụng gán cho đại biểu không? Ví dụ, ủy quyền của UISearchDisplayController vẫn được gán. Tại sao nó không được cập nhật?
Pwner

@Pwner có vẻ như nó đã không được dùng nữa trong iOS 8.0
Stavash

Dưới đây là một ví dụ không chấp nhận: thậm chí UITableViewassigncho đại biểu của nó:@property (nonatomic, assign) id <UITableViewDelegate> delegate;
Chris Nolet

3
@ChrisNolet Vì có thể họ vẫn đang sử dụng MRC (Đếm tham chiếu thủ công) trong nội bộ.
Marco Sero

2
Cho đến ngày hôm nay, ví dụ về đại biểu của UITableView hiện là: @property (nonatomic, yếu, nullable) id <UITableViewDelegate> đại biểu; Vì vậy, đó không còn là một ví dụ hợp lệ.
sdoowhsoj
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.