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?
答案 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.