iOS

iOS 面试题分析(一)

2021-07-29  本文已影响0人  俊而不逊

1.回顾

在之前的博客中,对OC底层进行了一系列的探索分析,相信小伙伴们都学到了一定的知识,但是底层源码分析比较枯燥,那么本次就对一些面试题进行分析。


iOS

1.1 补充

在上篇博客iOS底层探索之类的加载(四):类的关联对象AssociatedObject中主要讲了类的扩展类的关联对象移除关联还没有讲,这里就做一点补充。

void objc_removeAssociatedObjects(id object) 
{
    if (object && object->hasAssociatedObjects()) {
        _object_remove_assocations(object, /*deallocating*/false);
    }
}
void
_object_remove_assocations(id object, bool deallocating)
{
    ObjectAssociationMap refs{};

    {
        AssociationsManager manager;
        AssociationsHashMap &associations(manager.get());
        AssociationsHashMap::iterator i = associations.find((objc_object *)object);
        if (i != associations.end()) {
            refs.swap(i->second);

            // If we are not deallocating, then SYSTEM_OBJECT associations are preserved.
            bool didReInsert = false;
            if (!deallocating) {
                for (auto &ref: refs) {
                    if (ref.second.policy() & OBJC_ASSOCIATION_SYSTEM_OBJECT) {
                        i->second.insert(ref);
                        didReInsert = true;
                    }
                }
            }
            if (!didReInsert)
                associations.erase(i);
        }
    }

    // Associations to be released after the normal ones.
    SmallVector<ObjcAssociation *, 4> laterRefs;

    // release everything (outside of the lock).
    for (auto &i: refs) {
        if (i.second.policy() & OBJC_ASSOCIATION_SYSTEM_OBJECT) {
            // If we are not deallocating, then RELEASE_LATER associations don't get released.
            if (deallocating)
                laterRefs.append(&i.second);
        } else {
            i.second.releaseHeldValue();
        }
    }
    for (auto *later: laterRefs) {
        later->releaseHeldValue();
    }
}

上面👆这是移除关联对象的代码,这里就不过多分析源码了,我们看看在哪里调用了

在对象的生命周期,dealloc的时候

// Replaced by NSZombies
- (void)dealloc {
    _objc_rootDealloc(self);
}
void
_objc_rootDealloc(id obj)
{
    ASSERT(obj);

    obj->rootDealloc();
}

对象释放就会去找rootDealloc

inline void
objc_object::rootDealloc()
{
    if (isTaggedPointer()) return;  // fixme necessary?

    if (fastpath(isa.nonpointer                     &&
                 !isa.weakly_referenced             &&
                 !isa.has_assoc                     &&
#if ISA_HAS_CXX_DTOR_BIT
                 !isa.has_cxx_dtor                  &&
#else
                 !isa.getClass(false)->hasCxxDtor() &&
#endif
                 !isa.has_sidetable_rc))
    {
        assert(!sidetable_present());
        free(this);
    } 
    else {
        object_dispose((id)this);
    }
}

这里会判断isa.nonpointer、弱引用isa.weakly_referenced、关联对象isa.has_assoc等等,有的话就进入object_dispose

id 
object_dispose(id obj)
{
    if (!obj) return nil;

    objc_destructInstance(obj);    
    free(obj);

    return nil;
}

进入objc_destructInstance销毁实例

void *objc_destructInstance(id obj) 
{
    if (obj) {
        // Read all of the flags at once for performance.
        bool cxx = obj->hasCxxDtor();
        bool assoc = obj->hasAssociatedObjects();

        // This order is important.
        if (cxx) object_cxxDestruct(obj);
        if (assoc) _object_remove_assocations(obj, /*deallocating*/true);
        obj->clearDeallocating();
    }

    return obj;
}

C++方法,关联对象方法判断,就去走_object_remove_assocations也就是最开头的那个移除关联对象方法。

所以,关联对象不需要我们手动移除,会在dealloc时自动进行释放

2. iOS面试题分析

2.1 load与c++构造函数调用顺序

2.2 runtime是什么?

2.3 initialize调用顺序

2.4 同名分类方法的调用顺序

同名分类方法调用顺序分为两种情况:

iOS底层探索之类的加载(三): attachCategories分析博客里面也介绍了分类和load方法的一些加载。

2.5 分类和扩展的区别?

首先我们来看看什么是分类和扩展

category: 类别/分类

  • 专门用来给类添加新的方法
  • 不能给类添加成员属性,添加了成员变量,也无法取到
  • 注意:其实可以通过runtime给分类添加属性
  • 分类中用@property定义变量,只会生成变量的 getter,setter方法的声明,不能生成方法实现和带下划线的成员变量

extension:类扩展

  • 可以说成是特殊的分类,也称作匿名分类
  • 可以给类添加成员属性,但是是私有变量
  • 可以给类添加方法,也是私有方法

分类我们已经很熟悉了,这里就不必过多赘述了,下面介绍下扩展

extension

类扩展,我们平时用的是非常多的,如下

匿名扩展

what ? 什么,这就是扩展吗?天天用居然不知道!
是的,这就是扩展,平时用的是非常之多,但是很多人都不知道。

震惊

注意:类扩展要放在声明之后,实现之前,否则会报错。

更多内容持续更新

🌹 喜欢就点个赞吧👍🌹

🌹 觉得有收获的,可以来一波,收藏+关注,评论 + 转发,以免你下次找不到我😁🌹

🌹欢迎大家留言交流,批评指正,互相学习😁,提升自我🌹

上一篇下一篇

猜你喜欢

热点阅读