Có một vài điều cần xem xét ở đây. Đầu tiên, hướng dẫn về Nguyên tắc cơ bản về ca cao có phần lỗi thời. Nó không tính đến một số công nghệ hiện tại mà Apple đã phát triển, như Grand Central Dispatch và Automated Reference Counting. [Giữ lại] trong phương thức allocWithZone của bạn sẽ không biên dịch chính xác trong một dự án có hỗ trợ ARC (vì bạn mới sử dụng Obj-C, tôi đang tạo một giả định ở đây bạn cũng mới sử dụng iOS/iPhone, và vì vậy bạn nên đọc về hai công nghệ đó).
Có một cuộc thảo luận rất tốt của các mẫu thiết kế khác nhau singleton qua trong luồng này: What should my Objective-C singleton look like?
Tuy nhiên đó là một chủ đề lớn hơn, và như vậy không đưa vào tài khoản tự động đếm tham chiếu (Tôi đã sử dụng Louis Câu trả lời của Gerbang trong nhiều năm và nó không còn hoạt động trong các dự án hỗ trợ ARC nữa).
Đối với ARC-enabled dự án/file (có ARC có thể được kích hoạt chỉ cho các tập tin duy nhất) - chúng tôi đã chuyển đến một singleton sử dụng GCD và hoạt động khá tốt:
static YourClassName * volatile sharedInstance = nil;
+ (YourClassName *)sharedInstance
{
static dispatch_once_t sharedInstanceToken;
dispatch_once(&sharedInstanceToken, ^{
sharedInstance = [[YourClassName alloc] init];
});
return sharedInstance;
}
gì đang xảy ra ở đây? Vâng, nếu bạn xem qua GCD docs, bạn sẽ thấy dispatch_once chỉ được thực thi một lần trong suốt toàn bộ thời gian tồn tại của một ứng dụng cho một đối tượng cụ thể. Theo các tài liệu đi vào nói, điều này làm cho nó rất hữu ích cho việc tạo ra singletons một cách an toàn thread.
Trên hết, chúng tôi khai báo phương thức sharedInstance là dễ bay hơi, nghĩa là trình biên dịch/thời gian chạy sẽ không bao giờ cố gắng lưu lại cuộc gọi đến phương thức và phải luôn thực thi mã bên trong. Điều này làm cho chắc chắn rằng chúng tôi luôn luôn gọi vào GCD và chúng tôi luôn luôn lấy lại các đối tượng mà chúng tôi đang phải.
Tôi đang tô bóng trên một nhóm vì bạn mới sử dụng Obj-C, nhưng chắc chắn hãy xem xét GCD, ARC và sau đó khi bạn đã có nền tảng vững chắc trong Obj-C, hãy xem IMP caching , đó là những gì dễ bay hơi đang ngăn cản xảy ra.
Bạn có thể xem [bài đăng trước đây của tôi về triển khai mẫu đơn lẻ] (http://stackoverflow.com/questions/6912703/objective-c-static-field-and-implementing-singleton-pattern/6913036#6913036). Nếu đã đặt rất nhiều nhận xét trong mã triển khai. Hy vọng điều này sẽ giúp –
Tại sao bạn phân bổ siêu? Bạn không muốn một thể hiện của bản thân để thay thế? –
Đó là một tài liệu cũ đáng kinh ngạc. –