Tôi tìm thấy một số thông tin trong mạng để tạo ra một lớp singleton bằng cách sử dụng GCD. Thats mát mẻ vì nó an toàn thread với chi phí rất thấp. Đáng buồn là tôi không thể tìm thấy các giải pháp hoàn chỉnh mà chỉ tìm thấy các đoạn của phương thức sharedInstance. Vì vậy, tôi làm lớp riêng tôi bằng cách sử dụng phương pháp thử và sai - và et thì đấy - sau đây xuất hiện:Đúng đối tượng mẫu Singleton C (iOS)?
@implementation MySingleton
// MARK: -
// MARK: Singleton Pattern using GCD
+ (id)allocWithZone:(NSZone *)zone { return [[self sharedInstance] retain]; }
- (id)copyWithZone:(NSZone *)zone { return self; }
- (id)autorelease { return self; }
- (oneway void)release { /* Singletons can't be released */ }
- (void)dealloc { [super dealloc]; /* should never be called */ }
- (id)retain { return self; }
- (NSUInteger)retainCount { return NSUIntegerMax; /* That's soooo non-zero */ }
+ (MySingleton *)sharedInstance
{
static MySingleton * instance = nil;
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
// --- call to super avoids a deadlock with the above allocWithZone
instance = [[super allocWithZone:nil] init];
});
return instance;
}
// MARK: -
// MARK: Initialization
- (id)init
{
self = [super init];
if (self)
{
// Initialization code here.
}
return self;
}
@end
Xin vui lòng nhận xét và cho tôi biết nếu tôi đã thiếu một cái gì đó hoặc làm điều gì đó hoàn toàn sai;)
Cheers Stefan
tôi bị cám dỗ để thêm một '- (void) dealloc' mà ném một ngoại lệ, theo cách đó bạn sẽ có thể theo dõi các diễn viên vi phạm nếu ai đó đang nhận được một trường hợp singleton và sau đó phát hành nó. Ngoài việc là một sự lạm dụng của mô hình, mà sẽ để lại cho bạn một con trỏ lơ lửng. Câu hỏi meta – Tommy
: đây có phải là [http://codereview.stackexchange.com/] không? – Joren
táo khuyên không nên tạo ra những người độc thân ghi đè giữ lại/giải phóng! điều này sẽ phá vỡ các ứng dụng đang chuyển sang ARC –