7.iOS Runtime相关

2021-04-23  本文已影响0人  MT_suny

1.Category的实现原理?

2.isa指针的理解,对象的isa指针指向哪里?isa指针有哪两种类型?

3.Objective_C如何实现多重继承?

OC的类没有多继承,只支持单继承,如果要实现多继承的话,可以使用以下方式间接实现:
- (void)forwardInvocation:(NSInvocation *)anInvocation{
    SEL aSelector = [anInvocation selector];
    if([self.firstDelegate respondsToSelector:aSelector]){
        [anInvocation invokeWithTarget:self.firstDelegate];
    }
    if([self.secondDelegate respondsToSelector:aSelector]){
        [anInvocation invokeWithTarget:self.secondDelegate];
    }
}

这里有forwardIncocation方法的详细介绍

4.Runtime 如何实现weak属性?

weak此特质表明改属性定义了一种非拥有关系 (nonowning relationship).这种属性设置新值时,设置方法即不持有新值 (新指向的对象) ,不持有旧值 (原来指向的对象)
Runtime 对注册的类,会进行内存布局,从一个粗粒度的概念上讲,这时候会有一个hash表,这是一个全局表,表中是用weak指向的对象内存地址作为key,用所有指向对象的weak指针表作为value.当此对象的引用计数为0的时候回dealloc,假如该对象的内存地址是a,那么多就会以a为key,在这weak表中搜索,找到所有以a为key的weak对象,从而设置为nil.

5.OC的消息机制

6.runtime具体应用

7.runtime如何通过selector找到对应IMP地址?

每一个类对象中都有一个对象方法列表(对象方法缓存)

8.Objective-C中调用方法的过程

Objective-C是动态语言,每个方法在运行时会被动态转为消息发送,即 : objc_msgSend(receiver,selector),整个过程如下:

第一次: 动态添加一个新方法并执行的机会,当系统第一次找不到某个方法的时候, 会自动调用这个方法, 用来给程序添加一个新方法并执行的机会.

+ (bool)resolveInstanceMethod:(sel)sel{ }

第二次: 当系统调用上一个方法后未能实现添加新的方法, 则系统会再来调用下面的这个方法, 这个方法是系统提供的一个将 SEL 转给其他对象的机会.

- (id)forwardingTargetForselector:(sel)aselctor{ } 

第三次: 当 forwardingTargetForselector 返回的 nil 或者 self 时, 会进入到这个方法, 这个方法是拯救程序的最后一步.
这个方法用来返回一个方法签名, 在由后面的 forwardInvocation: 去执行

- (NSMethodSigature *)methodSignatrueForseletor:(sel)aselector{ } 

9.load和initialize的区别

两者都会自动调用父类的,不需要super操作,且仅会调用一次(不包括外部显示调用).

10.如何理解Objective-C是动态语言.

上一篇 下一篇

猜你喜欢

热点阅读