BAD_ACCESS

  • 出现这种错误通常是访问了野指针,比如访问了已经释放的对象,如对此对象发消息,访问对象的成员变量等
  • 调试:
  • 重写对象的respondsToSeletor方法,先找到出现EXECBADACCESS前访问的最后一个对象
  • 在preference设置Enable Zombie Objects
  • 设置全局断点所在行,接受所有异常
  • xcode的analyze

unrecognized selector

下⾯只讲述对象⽅法的解析过程:
  • 第⼀步:+ (BOOL)resolveInstanceMethod:(SEL)sel实现⽅法,指定是否动态添加⽅法。 若返回NO,则进⼊下⼀步,若返回YES,则通过class_addMethod函数动态地添加⽅ 法,消息得到处理,此流程完毕。
  • 第⼆步:在第⼀步返回的是NO时,就会进⼊- (id)forwardingTargetForSelector:(SEL)aSelector⽅法,这是运⾏时给我们的第⼆次机 会,⽤于指定哪个对象响应这个selector。不能指定为self。若返回nil,表⽰没有响应 者,则会进⼊第三步。若返回某个对象,则会调⽤该对象的⽅法。
  • 第三步:若第⼆步返回的是nil,则我们⾸先要通过- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector指定⽅法签名,若返回nil,则表⽰不处 理。若返回⽅法签名,则会进⼊下⼀步。
  • 第四步:当第三步返回⽅法⽅法签名后,就会调⽤- (void)forwardInvocation:(NSInvocation *)anInvocation⽅法,我们可以通过anInvocation 对象做很多处理,⽐如修改实现⽅法,修改响应对象等
  • 第五步:若没有实现- (void)forwardInvocation:(NSInvocation *)anInvocation⽅法,那么 会进⼊- (void)doesNotRecognizeSelector:(SEL)aSelector⽅法。若我们没有实现这个⽅ 法,那么就会crash,然后提⽰打不到响应的⽅法。到此,动态解析的流程就结束了。

其他Crash场景

  • 访问了僵⼫对象
  • 访问了不存在的⽅法
  • 数组越界
  • 在定时器下⼀次回调前将定时器释放,会Crash
One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.