Vì vậy, câu hỏi khá đơn giản. Bỏ qua các tác động của việc sử dụng quá mức mẫu đơn. Tôi đang cố gắng tìm một đĩa đơn đáng tin cậy trong Objective-C. Tôi đã đi qua này:Lớp tĩnh vs Singleton
@implementation SomeSingleTonClass
static SomeSingleTonClass* singleInstance;
+ (SomeSingleTonClass*)getInstance
{
static dispatch_once_t dispatchOnceToken;
dispatch_once(&dispatchOnceToken, ^{
singleInstance = [[SomeSingleTonClass alloc] init];
});
return singleInstance;
}
- (void)someMethodOnTheInstance
{
NSLog(@"DO SOMET WORK")
}
@end
này tôi khá hài lòng với nhưng nó dẫn đến rất nhiều về điều này:
[[SomeSingleTonClass getInstance] someMethodOnTheInstance];
Câu hỏi của tôi là, tại sao điều này tốt hơn so với một lớp học hoàn toàn tĩnh.
@implementation SomeStaticClass
static NSString* someStaticStateVariable;
- (id)init
{
//Don't allow init to initialize any memory state
//Perhaps throw an exception to let some other programmer know
//not to do this
return nil;
}
+ (void)someStaticMethod
{
NSLog(@"Do Some Work");
}
Tất cả những gì bạn thực sự đạt được là cuộc gọi phương thức tìm kiếm nhẹ nhàng hơn. Về cơ bản bạn trao đổi trên này:
[[SomeSingleTonClass getInstance] someMethodOnTheInstance];
Đối với điều này
[SomeStaticClass someStaticMethod];
Đây là một việc đơn giản hóa nhỏ chắc chắn, và bạn luôn có thể lưu trữ các ví dụ trong lớp học của bạn. Đây là sự tò mò trí tuệ hơn, những gì thần mục tiêu-C tôi pissing off bằng cách sử dụng các lớp học tĩnh thay vì singletons? Tôi chắc rằng tôi không thể là người đầu tiên nghĩ về điều này, nhưng tôi hứa, tôi đã thực hiện tìm kiếm trùng lặp trước. Vài câu trả lời tôi tìm thấy, tôi cảm thấy giống như dựa trên các phiên bản ca cao cũ hơn, bởi vì ngay cả những mẫu đơn được thảo luận dường như cũng gặp vấn đề về luồng.
Tôi nghĩ bạn nói đúng, nhưng câu hỏi đó khá phức tạp (mặc dù câu trả lời là chắc chắn!). Tôi sẽ để lại cho tôi lên, nhưng đưa ra câu trả lời trong chủ đề đó, tôi không cần phải chờ đợi upvotes về câu trả lời của Drummer. Đúng. Cảm ơn! – ChrisCM
Lớp tĩnh là gì? – Monolo
Một lớp tĩnh (có thể là một tên tốt hơn) là một lớp dựa trên các phương thức lớp và các biến lớp tĩnh, thay vì một đối tượng instantiated và các phương thức thể hiện. Đây là những gì làm cho nó một singleton thuận tiện. Đặc biệt nếu bạn mã phương pháp init của bạn để ném một ngoại lệ! – ChrisCM