-init
Objective-C でクラスのメソッドを非表示にする (プライベートにする) 必要があります。
どうやってやるの?
ベストアンサー1
NS_UNAVAILABLE
- (instancetype)init NS_UNAVAILABLE;
これは、使用不可属性の短縮版です。macOSで初めて登場しました。10.7そしてiOS5 の場合NSObjCRuntime.h では次のように定義されています#define NS_UNAVAILABLE UNAVAILABLE_ATTRIBUTE
。
あるバージョンではSwiftクライアントのみメソッドを無効にしますObjC コード用ではありません:
- (instancetype)init NS_SWIFT_UNAVAILABLE;
unavailable
追加するunavailable
ヘッダーに属性を追加してコンパイラエラーinit を呼び出すたびに。
-(instancetype) init __attribute__((unavailable("init not available")));
理由がない場合は、__attribute__((unavailable))
または と入力してください__unavailable
。
-(instancetype) __unavailable init;
doesNotRecognizeSelector:
使用doesNotRecognizeSelector:
NSInvalidArgumentException を発生させます。「ランタイム システムは、オブジェクトが応答または転送できない aSelector メッセージを受信するたびに、このメソッドを呼び出します。」
- (instancetype) init {
[self release];
[super doesNotRecognizeSelector:_cmd];
return nil;
}
NSAssert
使用NSAssert
NSInternalInconsistencyException をスローしてメッセージを表示します。
- (instancetype) init {
[self release];
NSAssert(false,@"unavailable, use initWithBlah: instead");
return nil;
}
raise:format:
使用raise:format:
独自の例外をスローするには:
- (instancetype) init {
[self release];
[NSException raise:NSGenericException
format:@"Disabled. Use +[[%@ alloc] %@] instead",
NSStringFromClass([self class]),
NSStringFromSelector(@selector(initWithStateDictionary:))];
return nil;
}
[self release]
オブジェクトがすでにalloc
ated されているため、これが必要です。ARC を使用する場合、コンパイラがこれを呼び出します。いずれにしても、意図的に実行を停止しようとしている場合は心配する必要はありません。
objc_designated_initializer
指定された初期化子の使用を強制的に無効にしたい場合はinit
、そのための属性があります。
-(instancetype)myOwnInit NS_DESIGNATED_INITIALIZER;
他の初期化メソッドが内部的に呼び出されない限り、警告が生成されますmyOwnInit
。詳細は最新のObjective-Cを採用次の Xcode リリース後 (だと思います)。