栈区
特点:由编译器自动完成分配和释放,不需要程序员手动管理,主要存储了函数的参数和局部变量值等。
堆区
特点:需要程序员手动开辟并管理内存。(OC有ARC, OC对象通常不需要程序员考虑释放问题)
BSS段 (全局区)(静态区)
特点:程序运行过程内存的数据一直存在,程序结束后由系统释放
常量区 (数据段)
特点:专门用于存放常量,程序结束后由系统释放
程序代码区
特点:用于存放程序运行时的代码,代码会被编译成二进制存进内存的程序代码区
内存五大区:
栈区和堆区是运行时分配的内存,其它区是编译时分配的
栈区的地址是连续的,并且是由高到低分配的
堆区的地址是不连续的,堆区的访问速度没有栈区快,因为堆区首先要找地址,然后再找值。而栈区直接找值。
引用计数是怎么存储的?
- 如果对象使用了TaggedPointer, 苹果会直接将其指针值作为引用计数返回
- 引用计数可以直接存储在优化过的isa指针中
- 如果isa指针存储不下, 引用计数就会把一部分存储在一个散列表中
PS: Tagged Pointer专门用来存储小的对象,例如NSNumber和NSDate。
Tagged Pointer指针的值不再是地址了,而是真正的值。所以,实际上它不再是一个对象了,它只是一个披着对象皮的普通变量而已。
所以,它的内存并不存储在堆中,也不需要malloc和free.
网友评论