目录
1、Objective-C的内存管理机制
2、Retain cycle的含义
3、怎样避免内存泄漏
Objective-C的内存管理机制
- 在oc中对象中存用的引用计数这一整数值
- 调用alloc或者retain方法后,引用计数+1
- 调用release后,引用计数-1
- 引用计数为0的时候,调用dealloc方法废弃对象
在Objective-C中,凡是继承自NSObject的类都提供了两种方法,retain和release。当我们调用一个对象的retain时,这个对象的内存计数加1,反之,当我们调用release时, 对象的内存计数减1,只有当对象内存计数为0时,这个对象才真正会被释放,此时,对象的delloc方法会被调用来做些内存回收前的工作。
内存计数机制的好处在于我们可以明确分配一个使用权。比如,当一个对象A要使用另外一个对象B的时候,A会retain B一次以表示A使用B,而当B被使用完毕之后,A会 调用B的release方法来放弃使用权。这样,一个对象可以被多个其他对象使用。而作为使用它的对象,也不必关心自己之外 被使用对象的使用情况(内存方面)。一般来讲,对于类的成员变量,retain和release分别发生在赋值和自身释放的时候,这就是Obj-C程序中的经典写法:
头文件中:
@property (nonatomic,retain) NSObject *obj;
在.m文件里:
- (void)dealloc{
[obj release];
[super dealloc];
}
Retain cycle的含义
Retain cycle,翻译成中文大概叫保留环吧。既然父对象持有子对象,而子对象会随父对象释放而释放,那么,如果两个对象相互为父对象怎么办?
比如A和B两个对象,A持有B,B同时也持有A,按照上面的规则,A只有B释放之后才有可能释放,同样B只有A释放后才可能释放,当双方都在等待对方释放的时候, retain cycle就形成了,结果是,两个对象都永远不会被释放,最终内存泄露。所谓的内存泄露就是本应该释放的对象,在其生命周期结束之后依旧存在。
常见的内存泄漏存在于自己类里面的block调用了自己的类本身。
那么问题来了。我想要在自己本类里面的block调用自己类的属性怎么办呢?其实你只需要把属性当作参数进行传递就可以了。
student.study = ^(NSString * name){
NSLog(@"my name is = %@",name);
};
student.study(student.name);
怎样避免内存泄露
retain cycle使你编程的时候不得不注意一些问题。例如,要么尽量保持子对象引用父对象的时候使用弱引用,也就是assign,比如
@property (nonatomic,assign) NSObject *parent;
要么及时地将造成retain cycle中的一个变量设置为nil,将环break掉。如果注意点,这并不是什么特别大的问题
本人个人微信公众号地址(喜欢记得关注😯)
辛小二个人微信公众号地址
网友评论