iOS基础知识2

一、objc中向一个nil对象发送消息将会发生什么?

什么都不会发生!

SomeClass *someObject;
someObject = nil;
[someObject doSomething];
向nil发送了doSomething,OC中nil是被当做0定义的。也就是说Runtime时要去获取这个nil的信息,会去读取内存中0的位置,这肯定是不允许的,根据返回值类型,会返回nil、0、0.0等数据。




二、objc中向一个对象发送小心[obj foo]和objc_msgSend()函数之间有什么关系?

[obj foo]编译后就是objc_msgSend()函数调用。在Runtime中,objc_msgSend()是一个C函数,[obj foo]会被翻译成这样的形式objc_msgSend(obj,foo)。




三、什么时候会报unrecognized selector的异常?

objc在向一个对象发送消息时,Runtime库会根据对象的isa指针找到该对象实际所属的类,然后在该类中的方法列表以及其父类方法列表中寻找方法运行。如果,在最顶层的父类中依然找不到相应的方法时,程序在运行时会挂掉并抛出异常unrecognized selector。但是在抛出异常之前,objc的运行时会给出三次拯救程序崩溃的机会:
1、objc运行时会调用+resolveInstanceMethod:或者 +resolveClassMethod:,让你有机会提供一个函数实现。如果你添加了函数,那运行时系统就会重新启动一次消息发送的过程,否则 ,运行时就会移到下一步,消息转发(Message Forwarding)。
2、如果目标对象实现了-forwardingTargetForSelector:,Runtime 这时就会调用这个方法,给你把这个消息转发给其他对象的机会。只要这个方法返回的不是nil和self,整个消息发送的过程就会被重启,当然发送的对象会变成你返回的那个对象。否则,就会继续下一步。
3、这一步是Runtime最后一次给你挽救的机会。首先它会发送-methodSignatureForSelector:消息获得函数的参数和返回值类型。如果-methodSignatureForSelector:返回nil,Runtime则会发出-doesNotRecognizeSelector:消息,程序这时也就挂掉了。如果返回了一个函数签名,Runtime就会创建一个NSInvocation对象并发送-forwardInvocation:消息给目标对象。



四、一个objc对象的isa指针指向什么?有什么作用?

对象的isa指向类,类的isa指向元类(meta class),元类isa指向元类的根类。isa帮助一个对象找到它的方法。
isa:是一个Class 类型的指针。每个实例对象有个isa的指针,他指向对象的类,而Class里也有个isa的指针,指向meteClass(元类)。元类保存了类方法的列表。当类方法被调用时,先会从本身查找类方法的实现,如果没有,元类会向他父类查找该方法。同时注意的是:元类(meteClass)也是类,它也是对象。元类也有isa指针,它的isa指针最终指向的是一个根元类(root meteClass),根元类的isa指针指向本身,这样形成了一个封闭的内循环。



五、下面的代码输出什么?

@implementation Son : Father
- (id)init
{
    self = [super init];
    if (self) {
        NSLog(@"%@", NSStringFromClass([self class]));
        NSLog(@"%@", NSStringFromClass([super class]));
    }
    return self;
}
@end

输出都是:Son

当发送class消息时不管是self还是super,其消息主体依然是self,也就是说self和super指向的是同一个对象。只是查找方法的位置不同,一个是从本类Son,一个是从本类Son的父类Father。一般情况下,class方法只有在根类NSObject中定义,所以[self class]和[super class]都是在根类中找方法,接受消息主体是Son。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值