首页 > 学院 > 开发设计 > 正文

oc-内存管理 - 探路篇

2019-11-09 15:50:23
字体:
来源:转载
供稿:网友

一、过程:

生成对象 -> alloc持有对象 -> retain释放对象 -> release废弃对象:所有引用都释放 -> dealloc

二、MRC:需要手动释放自己持有的对象

[参考资料]:http://www.open-open.com/lib/view/open1460693431491.html

NSObject负责内存管理非自己生成的对象通过retain方法实现持有对象。

id obj = [NSArray array]; // 取得非自己生成并持有的对象 [obj retain];

调用autorelease后,对象不会被立即释放,而是注册到autoreleasepool中,知道pool结束,对象才被释放。

⚠️无法释放非自己持有的对象,但可持有非自己生成的对象。

三、ARC:自动释放自己持有的对象

释放方式:

1、赋其他值 2、超出作用域

所有权修饰符

_ _strong id类型和对象类型默认在超出变量作用域后被释放

_ _weak

解决循环引用问题(易发生互相强引用)当引用计数为0时,自动赋值nil必须是oc对象(assign可以非oc对象)weak被赋以一个非自己生成的对象,weak并不会立即释放,而是注册到AutoreleasePool中,延长生命周期。不持有对象⚠️与assign的区别 assign是指针赋值,不对引用计数操作,使用之后如果没有置为nil,可能产生野指针。而weak一旦不适用,自动赋值nil。

_ _ unsafe_unretained

_ _autoreleasing

三、@autoreleasepool

由于main.m中的UI applicationMain永远不会return,所以main.m中的autoreleasepool永远不会进入到释放阶段,而UIApplicationMain会自己创建main run loop,在Cocoa的runloop中包涵autoreleasepool。

四、对象指针的返回值

划分 retained return value -> 调用者拥有这个返回值。 alloc / copy / initunretained return value -> 调用者不拥有这个返回值。

五、对self.PRoprety直接赋值和间接赋值的差别

直接赋值: self.proprety = [[NSObject alloc] init]; //init的时候retainCount+1 , 赋值的时候retainCount+1,但autoreleasepool只减1
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表