Objective-C自定义Cocoa Touch类调用init方法崩溃原因求解
崩溃原因解析
- 核心错误是调用
init方法的主体错误,混淆了Objective-C类方法与实例方法的调用规则。
代码执行逻辑拆解
原错误代码的问题:
你拆分的两行初始化代码中:
myClass = [MyClass alloc];是合法调用:+alloc是MyClass的类方法,可直接通过类名调用,执行后会返回一块已经分配好内存、未初始化的MyClass实例,正常赋值给myClass变量。myClass = [MyClass init];是非法调用:-init是实例方法,仅能由MyClass的实例对象调用,你这行代码直接给MyClass这个类对象发送了init消息,类对象未实现实例级别的init方法,因此触发NSInvalidArgumentException异常,报错提示中的cannot init a class object也明确说明了这一点。
正确写法的逻辑:
myClass = [[MyClass alloc] init]; 执行时会先调用[MyClass alloc]得到未初始化的实例,再直接给这个实例发送init消息完成初始化,完全符合方法调用规则,因此可以正常运行。
如果你想保留拆分写法,只需要把第二行修改为myClass = [myClass init];,运行效果和合并写法完全一致。
内容的提问来源于stack exchange,提问作者stefanosn
相关产品推荐
相关产品推荐

