2010-03-18 35 views
11

Tôi có nên luôn tự giải phóng khi có lỗi trong init hay tôi chỉ nên làm như vậy nếu tôi đã khởi tạo biến mẫu đầu tiên?Tôi có nên tự giải phóng các phương thức init không thành công không?

Để đặt theo cách khác, mẫu này có hợp lệ không? Có một thời gian khi tôi không nên tự giải phóng bản thân bên trong một phương pháp init, hay tôi nên giả định rằng nếu dòng điều khiển đi vào init, bản thân nó có ít nhất một số giữ lại là 1?

- (id)init 
{ 
if ((self = [super init]) == nil) 
{ 
    [self release]; 
    return nil; 
} 

//do some init stuff 
if (somethingFailed) 
{ 
    [self release]; 
    return nil; 
} 
return self; 
} 

Trả lời

17

Nếu một số kiểm tra bạn cần trong phương pháp khởi tạo của bạn không thành công, thì bạn nên giải phóng self. Tuy nhiên, lưu ý rằng nếu [super init] trả về nil, không có nghĩa nào khi gửi bản phát hành đến selfselfnil. Điều này thực sự bị cau mày bởi Apple:

Bạn chỉ nên gọi [self release] tại điểm hỏng hóc. Nếu bạn nhận được nil quay lại từ lời gọi khởi tạo của lớp cha, bạn cũng không nên gọi số release.

Ví dụ:

- (id)init 
{ 
    self = [super init]; 
    if(self) { 
     // do some init stuff 

     if (somethingFailed) 
     { 
      [self release] 
      self = nil; 
     } 
    } 

    return self; 
} 

Ngoài ra hãy xem tài liệu Mac Dev Center trên Handling Initialization Failure

+0

Ah, dường như quá rõ ràng bây giờ mà bạn trỏ nó ra. Tôi đã được một chút ném ra bởi vì tôi đang gọi phát hành trên một đối tượng mà tôi đã không gọi alloc/copy/new etc on. – leo

+1

Vâng, nguyên tắc cơ bản là bất kỳ ai gặp lỗi đầu tiên trong quá trình khởi tạo sẽ giải phóng không gian được cấp phát mà init đang được gọi, và sau đó sẽ trả về nil. Vì mọi người khác đều không có, họ không có cách nào giải phóng bộ nhớ, do đó tại sao bạn nên gọi phát hành trên bản thân để tránh rò rỉ bộ nhớ. –

+0

Làm cho cảm giác, cảm ơn. – leo

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