iOS

835 阅读3分钟

1.对象dealloc都做了哪些操作?

大概意思是:dealloc方法在最后一次release后被调用,但此时实例变量(Ivars)并未释放,父类的dealloc的方法将在子类dealloc方法返回后自动调用

理解:ARC下对象的实例变量在根类[NSObject dealloc]中释放(通常root class都是NSObject),变量释放顺序各种不确定(一个类内的不确定,子类和父类间也不确定,也就是说不用care释放顺序)

通过apple的runtime源码,不难发现NSObject执行dealloc时调用_objc_rootDealloc继而调用object_dispose随后调用objc_destructInstance方法,前几步都是条件判断和简单的跳转,最后的这个函数如下:
void *objc_destructInstance(id obj)
{
    if (obj) {
        Class isa_gen = _object_getClass(obj);
        class_t *isa = newcls(isa_gen);

        // Read all of the flags at once for performance.
        bool cxx = hasCxxStructors(isa);
        bool assoc = !UseGC && _class_instancesHaveAssociatedObjects(isa_gen);

        // This order is important.
        if (cxx) object_cxxDestruct(obj);
        if (assoc) _object_remove_assocations(obj);

        if (!UseGC) objc_clear_deallocating(obj);
    }

    return obj;
}

简单明确的干了三件事:
执行一个叫object_cxxDestruct的东西干了点什么事
执行_object_remove_assocations去除和这个对象assocate的对象(常用于category中添加带变量的属性,这也是为什么ARC下没必要remove一遍的原因 (Edit: 在ARC或MRC下都不需要remove,感谢@sagles的基情提示)
执行objc_clear_deallocating,清空引用计数表并清除弱引用表,将所有weak引用指nil(这也就是weak变量能安全置空的所在)


所以,所探寻的ARC自动释放实例变量的地方就在cxxDestruct这个东西里面没跑了。

ARC actually creates a -.cxx_destruct method to handle freeing instance variables. This method was originally created for calling C++ destructors automatically when an object was destroyed.


ARC下对象的成员变量于编译器插入的.cxx_desctruct方法自动释放
ARC下[super dealloc]方法也由编译器自动插入


总结:
dealloc --> objc_rootDealloc -->objc_dispose -->objc_destructInstance

执行一个叫object_cxxDestruct的东西干了点什么事
执行_object_remove_assocations去除和这个对象assocate的对象(常用于category中添加带变量的属性,这也是为什么ARC下没必要remove一遍的原因 (Edit: 在ARC或MRC下都不需要remove,感谢@sagles的基情提示)
执行objc_clear_deallocating,清空引用计数表并清除弱引用表,将所有weak引用指nil(这也就是weak变量能安全置空的所在)

函数实现的功能是向父类转发dealloc的调用,实现了自动调用[super dealloc]方法。

category的属性
https://www.jianshu.com/p/eec3fb94b2e6

2.js和oc都交互?

3.启动优化。

4.读过哪些源码? www.jianshu.com/p/488c1f46c… 5.三次握手,四次挥手

6.C语言中不能在不同的文件中声明相同的方法,所以用static。 baijiahao.baidu.com/s?id=163056…

7.离屏渲染

8.oc内存管理。 www.jianshu.com/p/ef6d9bf8f…

引用计数 blog.tracyone.com/2015/06/14/…

dealloc:三件事 www.jianshu.com/p/0f9b990e8…

对象绑定 www.jianshu.com/p/0f9b990e8…

www.jianshu.com/p/379e2c127…

  1. Category的实现原理,以及Category为什么只能加方法不能加属性?

www.jianshu.com/p/fa66c8be4…

问: Category的实现原理,以及Category为什么只能加方法不能加属性?

答:分类的实现原理是将category中的方法,属性,协议数据放在category_t结构体中,然后将结构体内的方法列表拷贝到类对象的方法列表中。 Category可以添加属性,但是并不会自动生成成员变量及set/get方法。因为category_t结构体中并不存在成员变量。通过之前对对象的分析我们知道成员变量是存放在实例对象中的,并且编译的那一刻就已经决定好了。而分类是在运行时才去加载的。那么我们就无法再程序运行时将分类的成员变量中添加到实例对象的结构体中。因此分类中不可以添加成员变量。 www.jianshu.com/p/fa66c8be4…

load 方法调用顺序

内存地址 父类,子类,分类

initlize中

方法第一次调用时会调,每个类只调用一次,父类可能多次,消息转发 分类覆盖本类。

autorelease 对象什么时候释放? 在本次runloop结束的时候。

说一说对runtime的理解?

arc下变量的内存什么时候释放

runloop

block __strong 什么时候用? www.jianshu.com/p/fe772a353…

响应者链

静态库动态库区别 __data __text

线程同步如何做?

锁有哪些?