ios+android+内存管理,iOS 内存管理(一)

前言

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、给属性指定选项

828e4b0b90df

828e4b0b90df

828e4b0b90df

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

一些记录点:

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

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

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

4、在block 里使用外部变量或对象的时候,用__blcok 修饰时实质是指针拷贝

5、GC 垃圾回收机制  只支持 mac os

参考:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值