Objective-C で -init メソッドをプライベートにすることは可能ですか? 質問する

Objective-C で -init メソッドをプライベートにすることは可能ですか? 質問する

-initObjective-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

使用NSAssertNSInternalInconsistencyException をスローしてメッセージを表示します。

- (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]オブジェクトがすでにallocated されているため、これが必要です。ARC を使用する場合、コンパイラがこれを呼び出します。いずれにしても、意図的に実行を停止しようとしている場合は心配する必要はありません。

objc_designated_initializer

指定された初期化子の使用を強制的に無効にしたい場合はinit、そのための属性があります。

-(instancetype)myOwnInit NS_DESIGNATED_INITIALIZER;

他の初期化メソッドが内部的に呼び出されない限り、警告が生成されますmyOwnInit。詳細は最新のObjective-Cを採用次の Xcode リリース後 (だと思います)。

おすすめ記事