Thêm hai xu vào việc cải thiện độ chính xác và phong cách. Trong hầu hết các trường hợp, bạn sẽ chỉ sử dụng một hoặc một vài thành viên self
trong khối này, rất có thể chỉ để cập nhật một thanh trượt. Đúc self
là quá mức cần thiết. Thay vào đó, tốt hơn là nên rõ ràng và chỉ chọn các đối tượng mà bạn thực sự cần trong khối. Ví dụ: nếu đó là một ví dụ của UISlider*
, giả sử _timeSlider
, chỉ cần làm như sau trước khi khai báo khối:
UISlider* __weak slider = _timeSlider;
Sau đó chỉ cần sử dụng slider
bên trong khối. Về mặt kỹ thuật, điều này chính xác hơn vì nó thu hẹp chu kỳ giữ tiềm năng chỉ với đối tượng mà bạn cần chứ không phải tất cả các đối tượng bên trong self
.
Ví dụ đầy đủ:
UISlider* __weak slider = _timeSlider;
[_embeddedPlayer addPeriodicTimeObserverForInterval:CMTimeMake(1, 1)
queue:nil
usingBlock:^(CMTime time){
slider.value = time.value/time.timescale;
}
];
Ngoài ra, rất có thể đối tượng được truyền tới một con trỏ yếu đã là một con trỏ yếu bên trong self
cũng như giảm thiểu hoặc loại bỏ hoàn toàn khả năng của một chu kỳ giữ lại. Trong ví dụ trên, _timeSlider
thực sự là một thuộc tính được lưu trữ dưới dạng tham chiếu yếu, ví dụ:
@property (nonatomic, weak) IBOutlet UISlider* timeSlider;
Về kiểu mã hóa, như với C và C ++, các khai báo biến được đọc tốt hơn từ phải sang trái. Khai báo SomeType* __weak variable
theo thứ tự này đọc tự nhiên hơn từ phải sang trái là : variable is a weak pointer to SomeType
.
timerDisp
một tài sản trên lớp?