iOS内存管理——alloc/release/dealloc方法的GNUstep实现与Apple的实现

这篇博客深入探讨了iOS内存管理,对比了GNUstep和Apple在alloc、release、dealloc方法的实现。文章介绍了GNUstep中内存分配的NSZone概念,以及对象内存头部的引用计数结构体。同时,通过对Apple实现的推测,讨论了Apple可能采用的引用计数表来管理内存,以避免内存碎片并方便检测内存泄漏。
摘要由CSDN通过智能技术生成

关于阅读《Object-C高级编程-iOS与OS X多线程和内存管理》一书后的iOS内存管理系列思考

iOS内存管理——alloc/release/dealloc方法的GNUstep实现与Apple的实现

接上篇关于iOS内存管理的规则考我们通过alloc/release/dealloc方法的具体实现来深入探讨内存管理。

什么是GNUstep

    `GNUstep`是`Cocoa`框架的互换框架,从源代码的实现上来说,虽然和Apple不是完全一样,但是从开发者的角度来看,两者的行为和实现方式是一样,或者说是非常相似。
    因为`NSObject`类的`Foundation`框架是不开源的,不过,`Foundation`框架使用的`Core Foundation`框架的源码和通过调用`NSObject`类进行内存管理部分的源码是公开的。
    所以,我们先来了解`GNUstep`的实现方式,有助于我们去理解`Apple`的实现方式。

GNUstep更多详细内容请查看官网

搞出些事情

  • GNUstep/modules/core/base/Source/NSObject.m alloc
+ (id)alloc {
    return [self allocWithZone:NSDefaultMallocZone()];
}

+ (id)allocWithZone:(struct _NSZone *)zone {
    return NSAllocateObject(self, 0, zone);
}

我们可以看到内存的分配最重是通过allocWithZoneNSAllocateObject方法分配的。

我们来看一下NSAllocateObject的声明:

NSAllocateObject(<#Class  _Nonnull aClass#>, <#NSUInteger extraBytes#>, <#NSZone * _Nullable zone#>)

实现:

static obj_layout {
    NSUInteger retained;
};

inline id

NSAllocateObject(Class  _Nonnull aClass, NSUInteger extraBytes, NSZone * _Nullable zone){
    int size = 计算容纳对象所需内存大小;
    id new = NSZoneMalloc(zone, size);
    memset(new, 0, zize);
    new = (id)&((static obj_layout *) new)[
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值