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
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ớpNSObject
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]
.
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.
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.
- 1. Có cần gọi [super encodeWithCoder] khi subclassing một đối tượng thực hiện NSCoding không?
- 2. Tại sao trong Objective-C, chúng ta sử dụng self = [super init] thay vì chỉ [super init]?
- 3. iPhone: [super viewDidUnload] gọi số
- 4. Có ổn không khi gọi [super loadView]?
- 5. Tôi có nên gọi [super superMethod] sau mã của riêng tôi hoặc trước mã không?
- 6. phải gọi super() lỗi trong Netbeans
- 7. initWithCoder: không hiển thị trong NSObject?
- 8. `[super viewDidLoad]` convention
- 9. Powermock, Mockito nullpointerexception khi gọi super() JDialog
- 10. java.lang.VerifyError: (class: ea/Individual, phương thức: <init> chữ ký: (I) V) Constructor phải gọi super() hoặc this()
- 11. Maven Super POM
- 12. Generics ..? Super T
- 13. super() trong hàm tạo
- 14. Tôi có sử dụng super() chính xác không?
- 15. Nên [super loadView] được gọi từ loadView hay không?
- 16. Tôi có nên gọi super() hoặc gọi phương thức này() cho các nhà xây dựng chế độ xem tùy chỉnh của Android không?
- 17. Đề cập đến "this" trong khi gọi super constructor?
- 18. Tôi có phải gọi super() trong hàm dựng khi lớp mở rộng Sprite trong actionscript3 không?
- 19. JavaScript Prototype Chaining super class constructor và phương thức gọi
- 20. Generics <? super> wildcard
- 21. Thừa kế Javascript: gọi super-constructor hoặc sử dụng chuỗi nguyên mẫu?
- 22. Bạn có nên sử dụng super() bằng Python không?
- 23. Có ai thực sự sử dụng git super/subprojects không?
- 24. Lập bản đồ Cassandra Super Columns
- 25. Tại sao tôi phải gọi super -ealloc sau cùng và không phải trước tiên?
- 26. Tại sao "[self class] == [super class]"?
- 27. Khi nào thì initWithCoder được gọi?
- 28. "Thiếu cảnh báo [super dealloc]" trong dự án ARC
- 29. Tôi có thể sử dụng Python 3 super() trong Python 2.5.6 không?
- 30. super allocWithZone có một số nghi ngờ trong khái niệm lớp singleton