2013-05-30 27 views
13

Theo clang documentation, một phương thức trả id được ngầm nổi tiếng trở lại instancetype khi nó là một phương pháp lớp học bắt đầu với new hoặc alloc, hoặc một phương pháp dụ bắt đầu với retain, autorelease, init, hoặc self.Liệu instancetype có nên được sử dụng trên các phương thức phân bổ/new/init không?

Để đảm bảo tính nhất quán, những phương pháp này cũng có được viết để trả lại rõ ràng instancetype trong mã mới không?

- (instancetype)init { 
    self = [super init]; 
    if (self) { 
     // perform initialization 
    } 
    return self; 
} 

Có tài liệu nào về lý do tại sao hoặc tại sao không hoặc bất kỳ lý do nào? Dường như trong trường hợp này nó được hiểu chính xác giống như trình biên dịch.

Trả lời

18

Nó không thực sự cần thiết vì trình biên dịch sẽ tự động thúc đẩy các phương pháp đó để trả về instancetype, hiệu quả (như bạn đã nêu).

Điều này automatic inference được ghi lại trong tài liệu llvm.

Cá nhân? Tôi luôn tuyên bố chúng là instancetype một cách rõ ràng vì nó mô tả chính xác hợp đồng và nó làm cho việc tái cấu trúc dễ dàng hơn sau này.

+0

Giá trị mặc định là "id", không phải là instancetype. Trả về instancetype cung cấp cho bạn nhiều loại kiểm tra hơn. Không có sự khác biệt nếu mã của bạn là chính xác, nhưng trình biên dịch có thể bỏ sót các lỗi nếu bạn trả về id. – gnasher729

+2

@ gnasher729 Xem tài liệu về instancetype trong llvm (http://clang.llvm.org/docs/LanguageExtensions.html). 'instancetype' được tự động suy ra cho một số phương thức nhất định, và kết quả là,' instancetype' là mặc định trong những trường hợp đó. – bbum

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