IOS内存管理浅析

来源:互联网 发布:淘宝9.9包邮专区在哪 编辑:程序博客网 时间:2024/05/21 15:02

内存管理:

1 简述:

(1) java使用GC机制自动管理内存,Object-C支持手动管理内存,也支持GC机制,GC机制对IOS设备无效,仅对Mac OSX电脑有效

(2) Object-C使用alloc,new,copy的时候为对象分配内存,然后返回分配的内存的首地址存入指针变量,使用dealloc释放内存

(3) Object-C中的对象都是使用指针引用的,也就是在方法调用的时候传递的都是指针.


2:内存回收机制

(1) 采用计数器retainCount来表示对象的引用次数,一个对象在被alloc之后就retainCount就是1,之后每调用一次retain方法retainCount都会加1.(这里的调用指得是:调用retain方法).调用release都会使retainCount减1.


(2) 当Object-C发现一个对象的retainCount计数器为0时,就会调用这个对象从NSObject继承而来的dealloc方法回收内存,这个调用动作是Object-c运行环境完成的.

(但这里每一个对象的retainCount永远不会为0,系统会进行判断,若对象的retainCount值为1时,此时再执行release方法不会将retainCount的值置为0,而是直接调用dealloc方法,但对象的retainCount一直为1,对象任指向当初的内存,若此时再对对象进行操作就会产生异常).


(3)  按照谁创建谁负责回收的原则


3 列如下面的操作:

-(void) dealloc{ 

[city release]; 

[super dealloc]; 

}


-(void) setCity: (NSMutableString*) c{ 

[c retain];//---1 

[city release];//---2 

city=c;//---3 

} (测试:查看city release之后c 的计数器retainCount的值)

{

因为变量之间传递的都是指针,所以当变量的引用执行retain或release方法时,原变量的retainCount也会发生相应的变化.

}

(1) java使用GC机制的语言中,我们只需要写第三条语句,若在Object-C中只写第三条语句,我们管这种方式获得的city叫做弱引用,也就是city只是通过赋值操作.把自己指向了C指向的对象,但是对象本身的引用计数器没有任何变化,此时City就要承担[c release]之后所带来的风险.

(2) 大多数情况下,我们使用的是强引用(retain),先通过retain方法拿到对象的拥有权.

(3) 第二行代码目的:假如:city之前已指向一个对象,若不对city进行一次release,而直接把city指向c指向的对象,那么city原来指向的对象可能会出现内存泄露.

(4) 第一行代码和第二行代码顺序不能变换(原因:当把自己作为参数赋值给自己的时候,若先调用[c release] 那么回导致该对象的retainCount 变为0,从而被系统delloc回收,则[c retain] 就会报错).

(5) 当对象使用完后系统就会调用delloc方法,释放所有权.对象被release之后,指针任然指向当初的内存,若再调用对象的方法则会出现异常,可通过将指针赋值为nil ,虽然此时不会报错,但也屏蔽了错误.


4 iOS5及其以上版本不使用ARC机制的设置方法

  • (1) TARGETS Build Phases Compile Sources  点击Compiler Flags 设置为-fno-objc-arc









0 0
原创粉丝点击