重学OC第一篇:alloc流程初探

本文探讨Objective-C中的初始化流程,包括hasCustomAWZ()的判断、instanceSize计算实例大小、calloc的内存分配、initIsa的类绑定以及new、alloc、alloc+init的使用区别。详细解析了类初始化后的标志设置、实例大小的计算规则以及内存分配的细节。
摘要由CSDN通过智能技术生成

alloc调用

知识点

1. hasCustomAWZ()

在类完成+initialize方法后,会调用_finishInitializing方法里的cls->setInitialized()来进行标记这个类完成了+initialized

objc_class::setInitialized()
{
   
    Class metacls;
    Class cls;

    ASSERT(!isMetaClass());

    cls = (Class)this;
    metacls = cls->ISA();

    mutex_locker_t lock(runtimeLock);

//     Special cases:
//     - NSObject AWZ  class methods are default.
//     - NSObject RR   class and instance methods are default.
//     - NSObject Core class and instance methods are default.
//     adjustCustomFlagsForMethodChange() also knows these special cases.
//     attachMethodLists() also knows these special cases.

    // AWZ methods: +alloc / +allocWithZone:
    objc::AWZScanner::scanInitializedClass(cls, metacls);
    // Retain/Release methods that are extremely rarely overridden
	//
	// retain/release/autorelease/retainCount/
	// _tryRetain/_isDeallocating/retainWeakReference/allowsWeakReference
    objc::RRScanner::scanInitializedClass(cls, metacls);
    // Core NSObject methods that are extremely rarely overridden
	//
	// +new, ±class, ±self, ±isKindOfClass:, ±respondsToSelector
    objc::CoreScanner::scanInitializedClass(cls, metacls);

    // Update the +initialize flags.
    // Do this last.
    metacls->changeInfo(RW_INITIALIZED, RW_INITIALIZING);
}
bool hasCustomAWZ() const {
   
        return !cache.getBit(FAST_CACHE_HAS_DEFAULT_AWZ);
    }
void setHasDefaultAWZ() {
   
        cache.setBit(FAST_CACHE_HAS_DEFAULT_AWZ);
    }

从注释中可以得知NSObject是default AWZ,也可以跟scanInitializedClass源码得知, 而从setHasDefaultAWZ中得知值存在类的cache里的_flags中占第14位,cache.getBit中_flags & FAST_CACHE_HAS_DEFAULT_AWZ为真, 所以取非后hasCustomAWZ为false, 所以fastpath(!cls->ISA()->hasCustomAWZ())为真。

2. instanceSize

instanceSize用来计算应该开辟的空间大小

size_t instanceSize(size_t extraBytes) const {
   
        if (fastpath(cache.hasFastInstanceSize(extraBytes))) {
   
            return cache.fastInstanceSize(extraBytes);
        }

        size_t size = alignedInstanceSize() + extraBytes;
        // CF requires all objects be at least 16 bytes.
        if (size < 16) size = 16;
        return size;
   }

bool hasFastInstanceSize(size_t extra) const
    {
   
        if (
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值