2012-04-02 33 views
8

Thông thường khi tôi phân lớp từ lớp UI tôi sẽ gọi trình khởi tạo siêu lớp quan tâm. Tuy nhiên, tôi không chắc chắn về các chi tiết thực hiện của NSObject, và có vẻ như không có nhiều điều xảy ra về các thành viên vars, vì vậy tôi tự hỏi: tôi có cần phải gọi [super init] nếu phân lớp của tôi mở rộng NSObject?Tôi có cần gọi [super init] hoặc [super initWithCoder], v.v. cho NSObject

Trả lời

8

Về mặt kỹ thuật, không. Các documentation for -[NSObject init] nói rằng

Phương pháp init định nghĩa trong lớp NSObject làm không khởi tạo; nó chỉ đơn giản là trả về self.

Bởi vì nó được ghi chép lại và có lẽ đã là một loạt các mã mà dựa vào nó, mà thực tế là cao khó có thể thay đổi trong các phiên bản tương lai của Mac OS X.

Edit:BoltClock's a Unicorn mang lên một điểm mà tôi muốn làm cho hyperbolic hơn: tổng thời gian được lưu bằng cách không gọi -[NSObject init] cho tất cả mọi người bao giờ chạy chương trình của bạn không bao giờ vượt quá thời gian gỡ lỗi mà bạn phải chịu nếu bạn thay đổi lớp bậc trên cho lớp học của bạn khác với NSObject và quên thêm cuộc gọi đến [super init].

4

Từ documentation, nó không xuất hiện để làm bất cứ khởi tạo ở tất cả:

Phương pháp init định nghĩa trong lớp NSObject làm không khởi tạo; nó chỉ đơn giản là trả về self.

Tôi cho rằng sẽ vô hại nếu bạn không gọi theo số [super init], nhưng không có lý do gì để không tuân theo quy ước và bạn biết đấy, hãy gọi nó trong phân lớp của bạn. Ví dụ, lớp con của bạn có thể kết thúc kế thừa từ một lớp khác trong tương lai, có thể chứa logic khởi tạo trong phương thức -init của riêng nó mà lớp con của bạn sẽ yêu cầu.

0

Chỉ cần gọi qua một trong các trình khởi tạo được chỉ định của super trong quá trình triển khai của bạn vì bạn chỉ nên làm những gì rõ ràng và chính xác.

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