关于阅读《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/modules/core/base/Source/NSObject.m alloc
+ (id)alloc {
return [self allocWithZone:NSDefaultMallocZone()];
}
+ (id)allocWithZone:(struct _NSZone *)zone {
return NSAllocateObject(self, 0, zone);
}
我们可以看到内存的分配最重是通过allocWithZone
中NSAllocateObject
方法分配的。
我们来看一下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)[