web-dev-qa-db-ja.com

SwiftのfatalErrorに相当するObjective-Cはありますか?

スーパークラスのデフォルトのinitメソッドを破棄したい。これはSwiftのfatalErrorで簡単に実現できます。

class subClass:NSObject{
  private var k:String!

  override init(){
    fatalError("init() has not been implemented")
  }

  init(kk:String){
    k = kk
  }
}    

Objective-Cでそれを行うにはどうすればよいですか?

20
wj2061

この場合、例外を発生させることができます。

このようなもの。これを参照してください

  [NSException raise:@"InitNotImplemented" format:@"Subclasses must implement a valid init method"];
32
Shripada
NSAssert(NO, @"balabala");

または

- (instancetype)init NS_UNAVAILABLE;

==========更新==========

@Cœurに感謝します

NSAssertは本番環境ではデフォルトで無効になっていますが、これはFatalErrorとは異なります。 NSExceptionの方が優れています。

enter image description here

3
hstdt

NSObject's doesNotRecognizeSelector: メソッド。あなたは書くでしょう:

- (instancetype) init
{
    [self doesNotRecognizeSelector:_cmd];
}

どこ _cmdは、値がメソッドのセレクターであるすべてのメソッドの非表示パラメーターです。

3
CRD

最良の答えは私のものです;-)

実行がFatalErrorに遭遇すると、Xcodeは、FatalErrorが発生した行を表示し、ファイルや行番号などに関する情報をログウィンドウに表示します。

同じ動作が必要な場合は、「assert.h」を含めることにより、標準のOSライブラリで利用可能な「assert」を使用する必要があります。

#include "assert.h"

printf("Assertion false: blah, blah\n");
assert(false);

>>Assertion false: blah, blah
>>Assertion failed: (false), function +[X Y], file /Development/Tests/TestAssert.m, line 32.
0
Luc-Olivier