DDZombieMonitor

核心代碼分析:

自定義Dealloc:

- (void)newDealloc:(__unsafe_unretained id)obj {
    if ([self shouldDetect:[obj class]]) {
        void *p = (__bridge void *)obj;
        size_t memSize = malloc_size(p);
        if (memSize >= [DDZombie zombieInstanceSize]) {//有足夠的空間才覆蓋
            
            Class origClass = object_getClass(obj);
            
            ///析構對象
            objc_destructInstance(obj);
            
            ///填充0x55能稍微提升一些crash率
            memset(p, 0x55, memSize);
            memset(p, 0x00, [DDZombie zombieInstanceSize]);
            
            ///把我們自己的類的isa復制過去
            Class c = [DDZombie zombieIsa];
            memcpy(obj, &c, sizeof(void*));
            
            DDZombie* zombie = (DDZombie*)p;
            
            zombie.realClass = origClass;
            
            //默認為true,即:默認會記錄當前僵尸對象釋放時的調用棧
            if (_traceDeallocStack) {
                DDThreadStack *stack = hy_getCurrentStack();
                zombie.threadStack = stack;
                memSize += stack->occupyMemorySize();
            }
            
            //check是否達到內存閾值,達到閾值需要釋放一部分內存
            [self freeMemoryIfNeed];
            
            //更新內存占用值:_occupyMemorySize
            __sync_fetch_and_add(&_occupyMemorySize, (int)memSize);
            
            //如果保存僵尸對象的隊列滿了,先將隊頭的僵尸對象移除并釋放內存,再將當前僵尸對象入隊。
            void *item = ds_queue_put_pop_first_item_if_need(_delayFreeQueue, p);
            if (item) {
                [self freeZombieObject:item];
            }
        } else {
            [obj performSelector:@selector(hy_originalDealloc)];
        }
    } else {
        [obj performSelector:@selector(hy_originalDealloc)];
    }
}

流程總結 & 驗證:

1、析構對象

2、給指針內容填充上0x55

image

3、把DDZombie的isa復制到obj指針中

image

4、將obj原來的類型賦值給僵尸對象的realClass字段

image

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 面向對象的三大特性:封裝、繼承、多態(tài) OC內存管理 _strong 引用計數器來控制對象的生命周期。 _weak...
    運氣不夠技術湊閱讀 1,222評論 0 10
  • 成因 野指針就是指向一個已刪除的對象或者受限內存區(qū)域的指針。我們寫C++的時候強調指針初始化為NULL,強調用完后...
    上官soyo閱讀 21,285評論 4 80
  • 一、自定義kvo 在上篇文章 kvo原理分析[http://www.itdecent.cn/u/a569f590...
    HotPotCat閱讀 699評論 1 2
  • 網絡問題 HTTP get 和 post 的區(qū)別 get通過URL向Server獲取數據,也可以在URL里向Ser...
    quantiza閱讀 697評論 0 3
  • ios的風已吹過,繼續(xù)ios還是走c/c++后臺開發(fā)?或者風停了豬都摔下來了,需要更專業(yè)的人士?你為什么拿高薪?別...
    桃逸閱讀 632評論 0 0

友情鏈接更多精彩內容