Chuẩn bị phỏng vấn iOS 5 — Singletons
Mẫu đơn là một mẫu thiết kế đảm bảo rằng một lớp chỉ có một thể hiện và cung cấp một điểm truy cập toàn cầu cho thể hiện đó. Điều này có thể hữu ích khi một lớp cần được chia sẻ trên nhiều phần của ứng dụng, nhưng việc tạo nhiều phiên bản của lớp là không thực tế hoặc không mong muốn. Trong iOS, mẫu đơn là một mẫu thiết kế thường được sử dụng.
Câu hỏi phỏng vấn
- Singleton là gì và nó được sử dụng như thế nào trong quá trình phát triển iOS?
- Bạn có thể giải thích về mẫu thiết kế Singleton và những ưu điểm của nó không?
- Các cách khả thi để ngăn chặn nhiều phiên bản Singleton trong môi trường đa luồng là gì?
- Bạn có thể đưa ra ví dụ về thời điểm bạn sẽ sử dụng Singleton trong ứng dụng iOS của mình không?
- Làm thế nào để bạn kiểm tra Singleton trong iOS?
Một mối quan tâm thường xuyên với các singletons là chúng thường không an toàn cho luồng. Chúng thường được sử dụng từ nhiều bộ điều khiển truy cập đồng thời vào phiên bản đơn lẻ.
Bạn cần xem xét hai điều khi tạo một singleton
- Phiên bản phải được tạo theo cách an toàn luồng
- Bạn nên đánh dấu phương thức init của lớp là riêng tư để tránh tạo thêm các phiên bản
- Trong quá trình khởi tạo cá thể singleton.
- Trong quá trình đọc và ghi vào thể hiện.
Để triển khai mẫu singleton trong Swift, lớp cần phải là một singleton được xác định bằng từ static
khóa, cho biết rằng lớp chỉ có một phiên bản. Một biến tĩnh được sử dụng để lưu trữ thể hiện của lớp và một phương thức tĩnh được sử dụng để truy cập thể hiện. Đây là một ví dụ về một lớp đơn trong Swift
class Singleton {
// Swift guarantees initialization is atomic
// Swift treats the code performing initialization as a critical section
static let shared = Singleton()
// prevents the creation of additional instances of the class.
private init() {}
}
let singleton = Singleton.shared
@implementation MySingleton
// Lazy initializer
+ (instancetype)sharedInstance {
static dispatch_once_t once;
static id sharedInstance;
// The token ensures that init is executed only once in thread safety manner
dispatch_once(&once, ^{
_sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
// Prevent creating new instance of the singleton
- (instancetype)init __attribute__((unavailable("Use +[MyClass sharedInstance] instead")));
+ (instancetype)new __attribute__((unavailable("Use +[MyClass sharedInstance] instead")));
@end
ưu
- Đảm bảo rằng chỉ một phiên bản duy nhất của một lớp được tạo, điều này có thể giúp tiết kiệm bộ nhớ và cải thiện hiệu suất.
- Cung cấp một điểm truy cập toàn cầu vào thể hiện của lớp, điều này có thể giúp sử dụng nó dễ dàng hơn trong mã của bạn.
- Có thể hữu ích để triển khai các tài nguyên được chia sẻ, chẳng hạn như cơ sở dữ liệu hoặc kết nối mạng, cần được chia sẻ giữa các phần khác nhau trong mã của bạn.
- Có thể làm cho mã của bạn khó kiểm tra và gỡ lỗi vì nó giới thiệu trạng thái chung được chia sẻ giữa các phần khác nhau trong mã của bạn.
- Gây khó khăn cho việc tạo nhiều phiên bản của một lớp để thử nghiệm hoặc các mục đích khác.
- Có thể dẫn đến khớp nối chặt chẽ và vi phạm các nguyên tắc của thiết kế hướng đối tượng.
- Tùy chọn không tốt cho bất kỳ tác vụ nào liên quan đến phiên người dùng, vì bạn có thể cần phải hủy và tạo đơn mới khi người dùng đăng xuất.
Có bảo đảm 1 cho mỗi tài khoản (chứ không phải bảo đảm 1 cho mỗi ứng dụng). Quyền truy cập không phải là toàn cầu (bạn cần có phiên người dùng). Tương tự như singleton, được tạo một cách lười biếng trong lần truy cập đầu tiên, cùng một phiên bản luôn được trả về sau đó. Ví dụ: MyUserSession, được tạo khi người dùng được xác thực bắt đầu phiên. Nó phải được đưa vào bất kỳ mã nào chứa dữ liệu người dùng