2012-03-24 40 views
7

Câu hỏi đơn giản:Obj-C: NSError trong trình khởi tạo

Tôi có phương thức init trong lớp có khả năng bị lỗi. Nếu có, tôi dự định "trả lại" nhưng tôi cũng muốn trả lại lỗi. Có thực hành không tốt để có tham số NSError ** với phương thức init không? khai phương pháp của tôi sẽ trông như thế này:

- (id) initWithArgs:(NSString*) args andError:(NSError**)error; 

Rất cám ơn, Nick

Trả lời

7

Đó là không bình thường, nhưng tôi không nghĩ rằng đó là thiết phải là một thói quen xấu. Tôi muốn đặt tên cho phần thứ hai của phương thức chỉ là "lỗi" thay vì "andError:". Bạn không cần phải kết nối các phần của tên phương thức với 'và', và trong trường hợp này nó cũng cho biết rằng lỗi đang được sử dụng để khởi tạo đối tượng. Chỉ cần làm cho nó:

- (id) initWithArgs:(NSString*) args error:(NSError**)error; 

Ngoài ra, đừng quên để giải phóng đối tượng được phân bổ nếu bạn có kế hoạch quay trở lại cái gì khác (như bằng không):

- (id) initWithArgs:(NSString*) args error:(NSError**)error 
{ 
    if ((self = [super init])) { 
     if (canInitThisObject) { 
      // init this object 
     } 
     else { 
      [self release]; 
      self = nil; 
      if (error != nil) { 
       *error = [NSError errorWithDomain:someDomain code:someCode: userInfo:nil]; 
      } 
     } 
    } 
    return self; 
} 
+1

Một điều tôi muốn giới thiệu là luôn luôn thiết lập lỗi nil ở đầu phương thức. Không có gì đảm bảo rằng người gọi sẽ xóa nó. – EricS

+4

@EricS Không có lý do nào để đặt 'error' thành' nil' trừ khi có lỗi. Người gọi sẽ không bao giờ nhìn vào giá trị '@ error' trừ khi phương thức trả về' nil'. Để làm khác là một lỗi. @Caleb mà mã cần kiểm tra để đảm bảo 'error' là không NULL trước khi gán cho' * error'. – bbum

+0

@bbum Xin cảm ơn - đã sửa. – Caleb