NS_UNAVAILABLE
- (instancetype)init NS_UNAVAILABLE;
Ini adalah versi singkat dari atribut yang tidak tersedia. Ini pertama kali muncul di macOS 10.7 dan iOS 5 . Ini didefinisikan dalam NSObjCRuntime.h sebagai #define NS_UNAVAILABLE UNAVAILABLE_ATTRIBUTE
.
Ada versi yang menonaktifkan metode ini hanya untuk klien Swift , bukan untuk kode ObjC:
- (instancetype)init NS_SWIFT_UNAVAILABLE;
unavailable
Tambahkan unavailable
atribut ke header untuk menghasilkan kesalahan kompiler pada panggilan apa pun untuk init.
-(instancetype) init __attribute__((unavailable("init not available")));
Jika Anda tidak memiliki alasan, ketikkan saja __attribute__((unavailable))
, atau bahkan __unavailable
:
-(instancetype) __unavailable init;
doesNotRecognizeSelector:
Gunakan doesNotRecognizeSelector:
untuk meningkatkan NSInvalidArgumentException. "Sistem runtime memanggil metode ini setiap kali suatu objek menerima pesan aSelector yang tidak bisa ditanggapi atau diteruskan."
- (instancetype) init {
[self release];
[super doesNotRecognizeSelector:_cmd];
return nil;
}
NSAssert
Gunakan NSAssert
untuk melempar NSInternalInconsistencyException dan menampilkan pesan:
- (instancetype) init {
[self release];
NSAssert(false,@"unavailable, use initWithBlah: instead");
return nil;
}
raise:format:
Gunakan raise:format:
untuk melempar pengecualian Anda sendiri:
- (instancetype) init {
[self release];
[NSException raise:NSGenericException
format:@"Disabled. Use +[[%@ alloc] %@] instead",
NSStringFromClass([self class]),
NSStringFromSelector(@selector(initWithStateDictionary:))];
return nil;
}
[self release]
diperlukan karena objek sudah alloc
terpasang. Saat menggunakan ARC, kompiler akan memanggilnya untuk Anda. Bagaimanapun, bukan sesuatu yang perlu dikhawatirkan ketika Anda akan menghentikan eksekusi dengan sengaja.
objc_designated_initializer
Jika Anda bermaksud menonaktifkan init
untuk memaksa penggunaan penginisialisasi yang ditunjuk, ada atribut untuk itu:
-(instancetype)myOwnInit NS_DESIGNATED_INITIALIZER;
Ini menghasilkan peringatan kecuali metode inisialisasi lainnya memanggil secara myOwnInit
internal. Detail akan dipublikasikan di Adopting Modern Objective-C setelah rilis Xcode berikutnya (saya kira).
NS_UNAVAILABLE
. Saya biasanya mendesak Anda untuk menggunakan pendekatan ini. Apakah OP akan mempertimbangkan untuk merevisi jawaban yang mereka terima? Jawaban lain di sini memberikan banyak detail berguna, tetapi bukan metode yang disukai untuk mencapai ini.