iOS中的 calloc 及权限修饰符
05 December 2020
iOS中的 calloc 及权限修饰符
内存分配: NSObject的alloc
类方法首先调用allocWithZone:
类方法,这和GUNstep实现相机,然后调用class_createInstance
函数,最后通过调用calloc
来分配内存块。
calloc
与malloc
的区别在于:用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修饰符提供弱引用,弱引用不能持有对象实例。
属性声明的属性与所有权修饰符的对应关系
循环引用:
- 类成员变量的互相强引用;
- 类成员变量对自身实例的强引用;
- block的循环引用,如self.block在其执行体内部强引用self;