NS_UNAVAILABLE
- (instancetype)init NS_UNAVAILABLE;
Đây là phiên bản ngắn của thuộc tính không có sẵn. Nó lần đầu tiên xuất hiện trong macOS 10.7 và iOS 5 . Nó được định nghĩa trong NSObjCR nb.h là #define NS_UNAVAILABLE UNAVAILABLE_ATTRIBUTE
.
Có một phiên bản chỉ tắt phương thức này cho các máy khách Swift , không phải cho mã ObjC:
- (instancetype)init NS_SWIFT_UNAVAILABLE;
unavailable
Thêm unavailable
thuộc tính vào tiêu đề để tạo ra lỗi biên dịch trên bất kỳ lệnh gọi nào đến init.
-(instancetype) init __attribute__((unavailable("init not available")));
Nếu bạn không có lý do, chỉ cần gõ __attribute__((unavailable))
hoặc thậm chí __unavailable
:
-(instancetype) __unavailable init;
doesNotRecognizeSelector:
Sử dụng doesNotRecognizeSelector:
để nâng cao NSInvalidArgumentException. Hệ thống thời gian chạy gọi phương thức này bất cứ khi nào một đối tượng nhận được thông báo aSelector mà nó không thể phản hồi hoặc chuyển tiếp.
- (instancetype) init {
[self release];
[super doesNotRecognizeSelector:_cmd];
return nil;
}
NSAssert
Sử dụng NSAssert
để ném NSIternalInconsistencyException và hiển thị một thông báo:
- (instancetype) init {
[self release];
NSAssert(false,@"unavailable, use initWithBlah: instead");
return nil;
}
raise:format:
Sử dụng raise:format:
để ném ngoại lệ của riêng bạn:
- (instancetype) init {
[self release];
[NSException raise:NSGenericException
format:@"Disabled. Use +[[%@ alloc] %@] instead",
NSStringFromClass([self class]),
NSStringFromSelector(@selector(initWithStateDictionary:))];
return nil;
}
[self release]
là cần thiết bởi vì các đối tượng đã được alloc
ated. Khi sử dụng ARC, trình biên dịch sẽ gọi nó cho bạn. Trong mọi trường hợp, không có gì phải lo lắng khi bạn chuẩn bị dừng thực thi.
objc_designated_initializer
Trong trường hợp bạn có ý định vô hiệu hóa init
để buộc sử dụng trình khởi tạo được chỉ định, có một thuộc tính cho điều đó:
-(instancetype)myOwnInit NS_DESIGNATED_INITIALIZER;
Điều này tạo ra một cảnh báo trừ khi bất kỳ phương thức khởi tạo nào khác gọi myOwnInit
bên trong. Chi tiết sẽ được công bố trong Thông qua Modern Objective-C sau khi phát hành Xcode tiếp theo (tôi đoán vậy).
NS_UNAVAILABLE
. Tôi thường khuyến khích bạn sử dụng phương pháp này. OP sẽ xem xét sửa đổi câu trả lời được chấp nhận của họ? Các câu trả lời khác ở đây cung cấp rất nhiều chi tiết hữu ích, nhưng không phải là phương pháp ưa thích để đạt được điều này.