关于Objective-C的内存管理小结

下面我会把Objective-C简称OC

OC中的管理机制为: 引用计数机制,引用计数下又分为MRC和ARC 

MRC 手动管理引用计数

ARC 自动管理引用计数

ARC 实现的原理是MRC

在系统中的对象

会引起引用计数改变的方法

在MRC中

retain 引用计数加1  release 减1

alloc 开辟内存空间 引用计数加1  dealloc 释放内存空间 引用计数减1

assign 修饰基本数据类型 和 id 类型 不改变引用计数

autorelease 当自动释放池释放时才释放

另再用类方法时候,需要自动释放池释放

比如 uiimage imageName 的方法 加载太多图片 可能会引起内存过啊 可用用读取文件 来加载

自动释放池除了 main函数 和自己写的 还有在用户与APP交互的时候也会产生 在这个时候所用的能自动管理的类  无论有用没用 都会被自动释放池释放

举例:

在tableView的页面加载时 数据图片存储在数组中 (属性)数组使用类方法(遍历构造器)创建的

_arr = [NSMutableArray array];(类方法) (此时引用计数未加1)

当在tableView中展示数据 用户在拖动tableView是 自动释放池 会释放_arr 程序会崩

 

解决办法

用self.arr = [NSMutableArray array];

self 会走set方法 会retain 引用计数会加1

在子线程中 是不会自动释放的 只有在主线程才会自动释放

copy 必须 遵循NSCopying协议

系统对象的copy

copy 分为浅copy 和 深copy

copy  代表浅copy 和 retain 一样 让引用计数加1 copy的地址

用copy 不用 retain 是为了防止 改变原来的 对像

浅copy 产生的对象都是不可变的

浅拷贝 引用计数加1 源对象

可变字符串 用copy浅copy 会是一个深copy

 

 

深copy copy的是对象

copy 数组 深浅 copy 数组里边 的元素是 浅copy

数组 及容器类的对象 深copy 是归档 反归档

 

深copy 会产生新的地址 可以把copy结果进行改变处理 源对象引用计数不变 副本引用计数加1

 

总结 只有源对象和副本对象都不可变,才是浅copy

,其他的都是深copy

举例:

NSMutableString 调用mutableCopy 深copy

NSMutableString 调用 copy 深copy

NSString 调用 mutableCopy 深copy

NSString 调用 copy 才是浅copy

 

非系统 对象 copy

根据自己的需要 想深copy 浅copy 都行 是在两个方法中

- (id)copyWithZone:(nullable NSZone *)zone

 

-            (id)mutableCopyWithZone:(nullable NSZone *)zone

在这两个方法中进行操作

 

strong 是 copy retain 的集合

 

在 ARC 中不能用 retain release 其他都可以用 MRC中的 东西

 

对于不是属性的对象用 __weak 和 __strong  __unsafe_unretained

 

__weak 修饰的对象会被释放自动指向nil 作用是防止循环引用 __unsafe_unretained

 差不多 但释放后不会指向nil 引用计数不加1

不要大量使用__weak 和 weak 因为释放后会指向nil

会消耗内存,只有在避免循环引用时使用

__strong 修饰的释放后不会指向nil 引用计数不加1 是objc中默认修饰对象的

 

强引用持有对象,弱引用不持有对象

强引用可以释放对象,但弱引用不可以,不持有对象,当一个弱引用指向一个强引用所持有的对象时,当强引用将对象释放掉后,弱引用会自动指向nil

 

循环引用

循环引用指的时指的是两个类中彼此拥有彼此,而且同时使用了彼此

如:

不过在大部分情况下,weak类型的指针可能并不会很常用。比较常见的用法是在两个对象间存在包含关系时:对象1有一个strong指针指向对象2,并持 有它,而对象2中只有一个weak指针指回对象1,从而避免了循环持有。一个常见的例子就是oc中常见的delegate设计模 式,viewController中有一个strong指针指向它所负责管理的UITableView,而UITableView中的 dataSource和delegate指针都是指向viewController的weak指针。可以说,weak指针的行为和MRC时的

assign有一些相似点,但是考虑到weak指针更聪明些(会自动指向nil)

 

内存泄露 是指只进行了分配没回收(MRC)

野指针: 指针指向了一个被释放的内存叫做野指针。

  

OC内存管理策略的选择

 

在MRC中

copy 只用于NSString block

retain 除NSString block以外的OC对象

assign 基本数据类型 枚举 结构体 当2个对象相互引用 一端用retain 一端用assign

 

在ARC中

copy 只用与 NSString block

strong 除NSString block 以外的数据

weak 当2个对象相互引用 一端strong  一端weak

assign 基本数据类 枚举 结构体 费OC对象

 

转载于:https://www.cnblogs.com/shen-qing-chang/p/5148825.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值