Nếu bạn làm theo những gì bây giờ được coi là thực hành tốt nhất, bạn nên tính phát hành ổ cắm, bởi vì bạn nên giữ lại chúng trong các thiết lập accessor:
@interface MyController : MySuperclass {
Control *uiElement;
}
@property (nonatomic, retain) IBOutlet Control *uiElement;
@end
@implementation MyController
@synthesize uiElement;
- (void)dealloc {
[uiElement release];
[super dealloc];
}
@end
Ưu điểm của phương pháp này là nó làm cho ngữ nghĩa quản lý bộ nhớ rõ ràng và rõ ràng, và nó hoạt động nhất quán trên tất cả các nền tảng cho tất cả các tệp nib.
Lưu ý: Các nhận xét sau chỉ áp dụng cho iOS trước 3.0. Với phiên bản 3.0 và mới hơn, bạn nên thay vào đó chỉ cần nil ra các giá trị thuộc tính trong viewDidUnload. Tuy nhiên, một điều cần xem xét ở đây là khi bộ điều khiển của bạn có thể vứt bỏ giao diện người dùng và tải lại động theo yêu cầu (ví dụ: nếu bạn có bộ điều khiển chế độ xem sẽ tải chế độ xem từ tệp nib, nhưng theo yêu cầu - nói dưới áp lực bộ nhớ - phát hành nó, với kỳ vọng rằng nó có thể được tải lại nếu xem là cần thiết một lần nữa). Trong tình huống này, bạn muốn chắc chắn rằng khi xem chính được xử lý của bạn cũng từ bỏ quyền sở hữu của bất kỳ cửa hàng khác để họ cũng có thể được deallocated. Đối với UIViewController, bạn có thể đối phó với vấn đề này bằng cách ghi đè setView:
như sau:
- (void)setView:(UIView *)newView {
if (newView == nil) {
self.uiElement = nil;
}
[super setView:aView];
}
Thật không may này làm nảy sinh một vấn đề nữa.Bởi vì UIViewController hiện đang thực hiện phương thức dealloc
của mình bằng phương thức truy cập setView:
(thay vì chỉ phát hành biến trực tiếp), self.anOutlet = nil
sẽ được gọi trong dealloc
cũng như để phản hồi cảnh báo bộ nhớ ... Điều này sẽ dẫn đến sự cố trong dealloc
.
Biện pháp khắc phục là để đảm bảo rằng các biến ổ cắm cũng được thiết lập để nil
trong dealloc
:
- (void)dealloc {
// release outlets and set variables to nil
[anOutlet release], anOutlet = nil;
[super dealloc];
}
Nếu chúng tôi có thuộc tính lưu giữ, chúng tôi có thể đơn giản hóa điều này bằng cách chỉ cần nói self.uiElement = nil; ở tất cả các địa điểm chúng tôi muốn phát hành, vì nó là thuộc tính lưu giữ, nên thực sự giải phóng nó đúng cách và đặt nó thành không có vấn đề, một trong những lợi thế của thuộc tính giữ lại. –
Bạn thường làm 'self.uiElement = nil;' trong 'viewDidUnload' không có trong' setView: '. Và nó sẽ được rõ ràng hơn để chỉ cần gọi 'self.anOutlet = nil;' trong dealloc. –
Bạn không nên gọi self.anOutlet = nil; trong dealloc. Đó là thực tế xấu để gọi accessors trong dealloc. – tobyc