请稍侯

iOS中的 calloc 及权限修饰符

05 December 2020

iOS中的 calloc 及权限修饰符

内存分配: NSObject的alloc类方法首先调用allocWithZone:类方法,这和GUNstep实现相机,然后调用class_createInstance函数,最后通过调用calloc来分配内存块。

callocmalloc的区别在于:calloc分配的内存区域会初始化为0;而使用malloc分配的内存区域是没有初始化为0的;如果使用malloc函数分配内存区域后还需要用memset等函数将内存填充为0,所以在OC里面推荐使用calloc分配内存;

GNUstep框架 iOS 里 Objective-C 中的内存管理是包含在Cocoa框架中用于OS X、iOS应用开发的,iOS中主要采用的是引用计数。因为包含NSObject类的Foundation框架没有公开,但从另一方来看可以从GNUset来理解苹果Cocoa实现,GNUstep是Cocoa框架的互换框架。

引用计数保存位置: GNUstep将引用计数保存在对象占用内存块头部的变量当中,而苹果的实现则是将其保存在引用计数表的记录中; 苹果对autorelease的实现是通过AutoreleasePoolPage来管理内存的。

所有权修饰符 __strong修饰符是id类型和对象类型默认的所有权修饰符。 __weak修饰符提供弱引用,弱引用不能持有对象实例。

属性声明的属性与所有权修饰符的对应关系

循环引用:

  1. 类成员变量的互相强引用;
  2. 类成员变量对自身实例的强引用;
  3. block的循环引用,如self.block在其执行体内部强引用self;