文章

内存管理

几个内存区

  1. 栈 - 由编译器自动分配释放
  2. 堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
  3. 全局区(静态区),全局变量和静态变量的存储是放在一块的 - 程序结束释放
  4. 文字常量区, 存放字符串常量。- 程序结束释放
  5. 程序代码区,存放2进制代码。

堆和栈主要的区别有以下几点:

  1. 管理方式不同: 堆内存有程序员管理,容易产生内存泄露 栈内存有编译器系统自动管理分配和释放,
  2. 空间大小不同: 堆内存基本上没限制,栈内存有编译器管理,会有限制
  3. 能否产生碎片不同: 堆内存会产生内存碎片, 栈内存是链式存储,不会产生碎片
  4. 生长方向不同;堆内存,生长方向是向上的,就是向着内存地址增加的方向;栈内存,生长方向是向下的,是向着内存地址减小的方向增长。
  5. 分配方式不同: 堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。
  6. 分配效率不同: 堆内存的分配效率没有栈内存高

iOS 内存管理

1
2
3
4
5
6
7
8
// 官方的内存管理文档
retain属性在赋值时的内部实现(retain新值,release旧值,最后赋值)
- (void)setCount:(Person *)person {
    if (![_person isEqual:person]) {
        [_person release];
        _person = [person retain];
    }
}


1
2
3
4
5
// 先做其他操作,再调用super方法
- (void)dealloc {
    [_person release];
    [super dealloc];
}


1
2
3
4
5
6
7
// copy修饰(release旧值,copy新值,最后赋值)
- (void)setName:(NSString *)name {  
    if (![_name isEqual:name]) {
        [_name release];  
        _name = [name copy];
    }
}


__autoreleasingARC 中主要用在 返回值 和 传递参数 的情况下;当修饰变量时,此变量会被加入自动释放池。

本文由作者按照 CC BY 4.0 进行授权