内存管理

来源:互联网 发布:贵州广电网络9频道 编辑:程序博客网 时间:2024/06/04 23:37
内容摘自网上,当时记录忘了留下网址,如有侵权请告知修改。

内存管理是依赖于对象的引用计数器来进行的,在每个对象中都有一个引用计数器(retainCount)。当调用这个对象的alloc,retain,new,copy会使计数器+1,release之后-1。如果一个对象的引用计数器为0,系统会自动调用对象的dealloc方法来销毁对象。
1. Xcode4.2之后引入了ARC机制,是为了方便简化内存管理,在程序编译时,Xcode自动识别代码并添加retain/release。所以仅仅是简化代码书写和部分性能优化
2. 对象存储在堆中,系统不会自动释放堆中内存。基本类型是放在栈中,有系统自己管理。
3. 常见的一个set函数
-(void)setCar:(Car *)car{
   
if (_car!=car) { //首先判断要赋值的变量和当前成员变量是不是同一个变量
       
[_car release]; //释放之前的对象
       
_car=[car retain];//赋值时重新retain
   
}
}
4. assign,retain,strong,weak是用来修饰属性,修饰临时变量前面 + __
assign:用于非指针变量:基础数据类型,c数据类型,还有id。只要不需要加 * 的都用assign。
retain:用于指针变量。XCode4.3之前需要手动释放,之后不需要
strong:ARC之后出现的,在Xcode4.3及之后,retain和strong一样
weak:ARC之后出现的,不会增加引用计数,如果对象被释放,自动变为nil,避免出现野指针
5. retain cycle
5.1 最简单的对象A持有对象B,对象B也持有A。解决方法:子对象引用父对象的时候用弱引用;及时将retain cycle中的一个变量设置为nil,破坏环
5.2 block造成的retain cycle
被block引用的变量都会被retain一次,又因为block本身也可以看做一个对象,所以下面会出现retain cycle

DoSomethingManager *manager = [[DoSomethingManager alloc] init];
manager.complete = ^{
    //...complete actions
    [manager otherAction];
    [manager release];
};

manager和block complete相互持有了,可以在这样解决,但是得保证不在需要complete回调

DoSomethingManager *manager = [[DoSomethingManager alloc] init];
manager.complete = ^{
    //...complete actions
    [manager otherAction];
    manager.complete = nil;
    [manager release];
};

ARC模式下,又有了新的方式
DoSomethingManager *manager = [[DoSomethingManager alloc] init];
manager.complete = ^{
    //...complete actions
    [manager otherAction];
    manager.complete = nil;
};
可以使用__block和__weak解决
__block DoSomethingManager *manager = [[DoSomethingManager alloc] init];
manager.complete = ^{
    //...complete actions
    [manager otherAction];
    manager = nil;
}; 
0 0
原创粉丝点击