Is there an Objective-C equivalent to Swift's fatalError?

时间:2016-05-17 03:34:56

标签: ios objective-c swift override subclass

I want to discard superclass's default init method.I can achieve this easily with fatalError in Swift:

class subClass:NSObject{
  private var k:String!

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

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

How can I do it in Objective-C?

5 个答案:

答案 0 :(得分:29)

在这种情况下,您可以引发异常:

像这样的东西。请参阅此

  [NSException raise:@"InitNotImplemented" format:@"Subclasses must implement a valid init method"];

或者您甚至可以使用assert语句。

NSAssert(NO, @"Subclasses must implement init");

答案 1 :(得分:2)

只需拨打NSObject的{​​{3}}方法即可。你会写:

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

其中_cmd是每个方法的隐藏参数,其值是方法的选择器。

答案 2 :(得分:2)

NSAssert(NO, @"balabala");

- (instancetype)init NS_UNAVAILABLE;

答案 3 :(得分:2)

最佳做法是在.h中声明:

(instancetype)init __attribute__((unavailable("init() is unavailable")));

然后,如果有人调用编译器,则该编译器将不会编译。

答案 4 :(得分:0)

最好的答案是我的;-)

当执行遇到FatalError时,您会得到Xcode,以显示FatalError遇到的行-并在日志窗口中显示有关文件,行号等的信息。

如果您想要相同的行为,则必须通过包含“ assert.h”来使用标准操作系统库中可用的“ 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.