iOS的管理机制

来源:互联网 发布:vmware player linux 编辑:程序博客网 时间:2024/05/17 22:08

iOS的管理机制下

最近很想研究研究一些基石类的概念, 这样可以稳定一下自己的地基, 在平时避免一些bug, 优化一下代码. 所以我就选择了iOS的内存机制.

>

  • 内存的五大区域
    (1). 栈区: 栈区是由系统自动分配的一块内存区域, 他可以存放一些函数的参数值, 局部变量的值, 和一些基础类型的值(int, float等). 当你所申请的空间大于栈中剩余的空间时, 会出现栈溢出, 导致程序崩溃.
    (2). 堆区: 堆区我们接触的就很多了, 它是由我们程序员自己动手分配的一块内存区域, 在堆区里有一个记录空闲内存区域的链表, 当你向系统申请一块内存区域时, 系统会自动遍历这个链表, 找到一块大于申请的空间. 然后将节点从链表中删除, 并将申请的相关信息存入该节点的首地址中, 将该节点的空间分配给程序. 同时, 当你释放掉申请的空间时, 系统会自动回收该内存, 重新添加到链表中.
    (3). 全局(静态)区: 存放全局变量和静态变量. 当程序结束时系统自动释放.
    (4). 常量区: 存放常量, 当程序结束后系统会自动释放.
    (5). 代码区: 存放函数体的二进制文件.

>

  • 关于retain, strong, copy, weak, assign, release, autorelease, alloc, dealloc.
    (1) 如果对象使用了retain, copy, alloc(引用计数加一), 那么就会相应的release或autorelease(引用计数减一)
    (2) arc下的strong和mrc下的retain的作用相类似, arc下的weak和mrc下的assign的作用相类似, 区别是weak指向的内存释放后自动置为空, 一面造成野指针.
    (3) elease和autorelease的区别: release和autorelease的区别就在于引用计数减一的触发时间, release是在调用时对象的引用计数就会减一, 而autorelease是在出对应的自动释放池对象的引用计数才会减一.
    (4) readwrite(默认): 表示既有getter方法,也有setter方法。readonly:表示只有getter方法,没有setter方法。nonatomic:不考虑线程安全。atomic(默认):线程操作安全
    (5) retain和copy的区别: retain是将对象的引用计数加一, 然后返回, copy是返回一个引用计数为一且不可变的对象, . 下面用代码来验证.
- (void)test{    // 对retain的实验    NSMutableArray *MarrayOfRetain = [NSMutableArray array];    NSLog(@"MarrayOfRetain = %@ address = %p", [MarrayOfRetain class], MarrayOfRetain);    NSMutableArray *arrOfRetain = [MarrayOfRetain retain];    NSLog(@"retain = %@ address = %p", [arrOfRetain class], arrOfRetain);    // 对copy的实验    NSMutableArray *MarrayOfCopy = [NSMutableArray array];    NSLog(@"MarrayOfCopy = %@ address = %p", [MarrayOfCopy class], MarrayOfCopy);    NSMutableArray *arrOfCopy = [MarrayOfCopy copy];    NSLog(@"copy = %@ address = %p", [arrOfCopy class], arrOfCopy);}

这里写图片描述

1 0
原创粉丝点击