Tuy nhiên, khi trả lại, không có mã nào trong tất cả kiểm tra xem đối tượng có thể tồn tại hay không. Nhưng nó nên được kiểm tra, và làm thế nào nó có thể được xử lý?
Thông thường, việc xử lý lỗi bị bỏ qua bởi các lớp con khi trả về nil
. Xử lý lỗi thường được để lại cho người gọi khi trả lại nil
. Như thể hiện trong thành ngữ -init
:
- (id)init {
self = [super init];
if (self) {
// initialize
}
return self;
}
như tốt, nếu căn cứ reallocates self
trong init
, sau đó self
được bố trí (self = [super init];
). hoạt động tốt.
Nếu bạn thất bại trong việc gán self
đến kết quả của initializer super
's hoặc nếu bạn thất bại trong việc kiểm tra nil
, sau đó bạn có thể được tổ chức vào một lơ lửng/con trỏ deallocated (EXC_BAD_ACCESS
), và bạn có thể không khởi ivars của bạn đúng cách (bạn sẽ gán chúng hiệu quả cho một khu vực khác nếu không gặp phải EXC_BAD_ACCESS
).
Hai trường hợp chi tiết hơn:
Fail gán tự
- (id)init {
[super init];
if (self) {
// self was not reassigned. if super returned an object other
// than self, then our ivar would be freed, reused, or sitting
// in an autorelease pool, and the returned instance's ivar
// would not be assigned -- we wouldn't know the address.
ivar = 1;
}
return self;
}
Fail để kiểm tra nil
- (id)init {
self = [super init];
// super returned nil. ivar is an invalid region:
ivar = 1;
return self;
}
và vâng, tôi đã thấy cả hai những cái này
Nếu đối tượng không thể tồn tại, không có nghĩa hệ thống là nghiêm trọng ra khỏi bộ nhớ, và thậm chí nảy lên một thông báo lỗi cũng sẽ không thể?
Không hề. Nhiều trình khởi tạo trả về nil
để nói "không thể thực hiện trong ngữ cảnh này" hoặc nếu có lỗi tham số đơn giản.
Đây thực sự là một câu hỏi khá hay. Tôi biết tôi không bao giờ kiểm tra nếu tôi nhận được một cái gì đó từ kết quả của loại chức năng, tôi chỉ giả định rằng phân bổ/init làm việc (trừ khi làm việc với một cái gì đó mất & lỗi, đại diện cho một cái gì đó mà có cơ hội thất bại). Một câu hỏi rất thú vị thực sự. – RonLugge
có thể trùng lặp của [In Objective-C tại sao tôi nên kiểm tra nếu self = \ [super init \] không phải là nil?] (Http://stackoverflow.com/questions/1287950/in-objective-c-why-should- i-check-if-self-super-init-is-not-nil) – omz