ios arc中内存管理对象有哪些

 我来答
快乐权御天下
2020-11-26 · TA获得超过2.9万个赞
知道大有可为答主
回答量:1.6万
采纳率:95%
帮助的人:526万
展开全部
iOS开发中,内存管理是从来都不能忽视的问题,OC采用的是动态内存管理方式,跟踪每个对象被引用的次数,当对象引用次数为0时,则释放对象占用的内存。引用计数分为自动和手动计数(retain 引用、release释放,autorelease 废弃),在此我主要对自动引用计数做相关的分享。

自动引用计数
自动引用计数顾名思义是自动计数管理,是编译器在编译过程中自动添加retain、release来确保对象被释放(注:arc 只能管理oc的对象,不能管理通过malloc申请的内存)并利用@autoreleasepool代替NSAutoreleasePool。

首先让我们先了解下内存管理的思维方式:

自己生成的对象,自己持有

非自己生成的对象,自己持有

不再需要自己持有的对象时释放

非自己持有的对象不能释放

了解了思维方式,那么怎么去生成并持有对象呢,在OC中有多种方法族大家并不陌生,用于初始化并持有对象,分别是alloc/new/copy/mutableCopy。另 init 方法族:以init 开头的方法必须被定义为实例方法,它一定要返回id 类型或父类、子类的指针;其他族可以是类方法也可以是实例方法。另 所有权声明 是通过 _ _strong(强引用,ARC中默认)、_ _weak(弱引用,常用于防止循环引用)、_ _unsafe_unretained(iOS 5下相当于weak)、_ _autoreleasing (自动释放池所用,id/对象 另加 星 * 类型变量 默认)。

引用计数表,在OC 中采用hash表来管理引用计数表键值为内存块地址;这样对象内存块就无需考虑头部了,直接通过引用计数表的内存块地址就可以找到对象内存块。

ARC规则
在ARC中有一些规则必须遵守否则会警告甚至引起程序崩溃

1、不能使用retain/release/retainCount/autorelease

arc 中内存由编译器控制,不必使用上述内存管理方法

2、不能使用NSAllocateObject/NSDeallocateObject

3、必须遵守内存管理方法命名规则 alloc/new/copy/mutableCopy/init

4、不可显示调用dealloc,不能使用NSZone

5、使用@autoreleasepool块代替NSAutoreleasePool

6、对象型变量不能作为C语言结构体的成员

7、显示转换id 和void 如 id obj =[NSObject alloc] init]; void *p =(_ _bridge void *)obj

属性
1、property 指一个对象的属性或特性

2、@synthesize :自动生成getter、setter方法;@dynamic 告诉编译器要自己手动实现 getter、setter

3、给属性指定选项







注:默认为 atomic ,必须要用lock unlock 保证属性的线程安全,如果不是频繁的使用且不考虑多线程的话,尽量用noatomic

一些记录点:
1、arc 的实现 是通过clang 编译器 和objc 运行时库结合进行内存管理

2、引用计数获取方法: _objec_rootRetainCount(id obj)

3、strong 与 retain 在 block 下,strong相当于copy ,retain 相当于 assign

4、_ _block 修饰相当于 指针拷贝 ,_ _weak 即为防循环引用

5、GC 垃圾回收机制 只支持 mac os
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式