Phương pháp +initialize
được gọi là tự động lần đầu tiên một lớp được sử dụng, trước khi bất kỳ phương thức lớp nào được sử dụng hoặc các phiên bản được tạo. Bạn không bao giờ nên tự gọi số +initialize
.
Tôi cũng muốn vượt qua cùng một miếng ngon Tôi đã học được rằng có thể cắn bạn xuống đường: +initialize
được thừa hưởng bởi lớp con, và cũng được gọi là cho mỗi lớp con mà không thực hiện một +initialize
của riêng mình. Điều này có thể đặc biệt có vấn đề nếu bạn ngây thơ thực hiện khởi tạo singleton trong +initialize
. Giải pháp là để kiểm tra kiểu của biến lớp học như vậy:
+ (void) initialize {
if (self == [MyParentClass class]) {
// Once-only initializion
}
// Initialization for this class and any subclasses
}
Tất cả các lớp học xuống từ NSObject có cả +class
và -class
phương pháp mà trả lại đối tượng Class
. Vì chỉ có một đối tượng Lớp cho mỗi lớp, nên chúng tôi muốn kiểm tra sự bình đẳng với toán tử ==
. Bạn có thể sử dụng điều này để lọc những gì sẽ xảy ra chỉ một lần, so với một lần cho mỗi lớp riêng biệt trong một hệ thống phân cấp (có thể chưa tồn tại) bên dưới một lớp đã cho.
Trên một chủ đề tiếp tuyến, nó có giá trị tìm hiểu về các phương pháp liên quan sau đây, nếu bạn chưa sẵn sàng:
Edit: Check-out bài này bằng cách @bbum giải thích thêm về +initialize
: http://www.friday.com/bbum/2009/09/06/iniailize-can-be-executed-multiple-times-load-not-so-much/
Ngoài ra, Mike Ash đã viết một thoải mái chi tiết Thứ Sáu Q & Một về +initialize
và +load
phương pháp: https://www.mikeash.com/pyblog/friday-qa-2009-05-22-objective-c-class-loading-and-initialization.html
Nguồn
2009-06-14 18:10:02
"if ([self class] == [MyParentClass class])" '[self class]' là dự phòng ở đây. bạn chỉ có thể nói 'if (self == [MyParentClass class])' – user102008
Cảm ơn bạn! Tidbit của bạn đã trả lời câu hỏi của tôi về lý do tại sao một trình khởi tạo tĩnh cụ thể đã được gọi hai lần. –