- 在Objective-C中向nil发送消息是完全有效的——只是在运行时不会有任何作用
- 如果一个方法返回值是一个对象,那么发送给nil的消息将返回0(nil) 2.如果方法返回值为指针类型,其指针大小为小于或者等于sizeof(void*)
- float,double,long double 或者long long的整型标量,发送给nil的消息将返回0
- 如果方法返回值为结构体,发送给nil的消息将返回0。结构体中各个字段的值将都是0
- 如果方法的返回值不是上述提到的几种情况,那么发送给nil的消息的返回值将是未定义的
- 具体原因分析
- objc是动态语言,每个方法在运行时会被动态转为消息发送,即:objc_msgSend(receiver, selector) #### 三次拯救程序崩溃的机会
- Method resolution
- objc运行时会调用+resolveInstanceMethod:或者 +resolveClassMethod:,让你有机会提供一个函数实现。
- 如果你添加了函数并返回 YES,那运行时系统就会重新启动一次消息发送的过程
- 如果 resolve 方法返回 NO ,运行时就会移到下一步,消息转发
- Fast forwarding
- 如果目标对象实现了-forwardingTargetForSelector:,Runtime 这时就会调用这个方法,给你把这个消息转发给其他对象的机会
- 只要这个方法返回的不是nil和self,整个消息发送的过程就会被重启,当然发送的对象会变成你返回的那个对象。
- 否则,就会继续Normal Fowarding。
- 这里叫Fast,只是为了区别下一步的转发机制。因为这一步不会创建任何新的对象,但Normal forwarding转发会创建一个NSInvocation对象,相对Normal forwarding转发更快点,所以这里叫Fast forwarding
- Normal forwarding
- 这一步是Runtime最后一次给你挽救的机会。
- 首先它会发送-methodSignatureForSelector:消息获得函数的参数和返回值类型。
- 如果-methodSignatureForSelector:返回nil,Runtime则会发出-doesNotRecognizeSelector:消息,程序这时也就挂掉了。
- 如果返回了一个函数签名,Runtime就会创建一个NSInvocation对象并发送-forwardInvocation:消息给目标对象 #### HTTP协议中POST方法和GET方法有那些区别?
- GET用于向服务器请求数据,POST用于提交数据
- GET请求,请求参数拼接形式暴露在地址栏,而POST请求参数则放在请求体里面,因此GET请求不适合用于验证密码等操作
- GET请求的URL有长度限制,POST请求不会有长度限制 使用block时什么情况会发生引用循环,如何解决? 在block内如何修改block外部变量? 使用系统的某些block api(如UIView的block版本写动画时),是否也考虑循环引用问题?
- 系统的某些block api中,UIView的block版本写动画时不需要考虑,但也有一些api 需要考虑
评论列表
文章目录