Để đồng bộ hóa việc tạo singleton, bạn nên sử dụng lớp của singleton làm đối tượng để đồng bộ hóa. Đây là mô hình thông thường của tôi:
+(MyObject*) singleton
{
static MyObject* singleton = nil;
@synchronized([MyObject class])
{
if(singleton == nil)
{
singleton = [[MyObject alloc] init];
}
}
return singleton;
}
điểm cần lưu ý:
Tôi đã thực hiện nó một phương pháp học. Bạn không thực sự phải làm, nó sẽ hoạt động như một phương thức thể hiện.
Thông thường trong các phương thức lớp học khi tham chiếu đến lớp học, bạn sẽ sử dụng self
(hoặc [self class]
trong các phương pháp ví dụ). Tuy nhiên, điều đó sẽ sai ở đây vì các lớp con sẽ đồng bộ hóa bằng cách sử dụng một đối tượng khác vào lớp MyObject.
Tôi đã đặt trả lại bên ngoài khối @synchronize
. Nó là hoàn toàn OK để trở về từ bên trong khối, nhưng nếu bạn làm, bạn nhận được một cảnh báo phân tích tĩnh giả mạo tĩnh nói rằng phương pháp có thể không trả về một giá trị.
Sửa
Các mô hình trên là từ lâu đã lỗi thời. Tốt nhất là nên sử dụng các mô hình dispatch_once
+(MyObject*) singleton
{
static dispatch_once_t onceToken;
static MyObject* singleton = nil;
dispatch_once (&onceToken, ^{
singleton = [[MyObject alloc] init];
});
return singleton;
}
trùng lặp http://stackoverflow.com/questions/1215330/how-does-synchronized-lock-unlock-in-objective-c –
Không hẳn là một bản sao, một câu hỏi có liên quan chắc chắn rồi. –