IOS内存管理浅析

原创 2015年07月09日 17:35:27

内存管理:

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









版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

iOS内存管理浅析

摘要:软件运行时会分配和使用设备的内存资源,因此,在软件开发的过程中,需要进行内存管理,以保证高效、快速的分配内存,并且在适当的时候释放和回收内存资源。 一、Objective-C内存管理的...

浅析C# 内存管理

  • 2014-07-16 12:32
  • 16KB
  • 下载

linux内存管理浅析

地址映射](图:左中) linux内核使用页式内存管理,应用程序给出的内存地址是虚拟地址,它需要经过若干级页表一级一级的变换,才变成真正的物理地址。 想一下,地址映射还是一件很恐怖的事情。当访问一...

linux内存管理浅析

[地址映射](图:左中) linux内核使用页式内存管理,应用程序给出的内存地址是虚拟地址,它需要经过若干级页表一级一级的变换,才变成真正的物理地址。 想一下,地址映射还是一件很恐怖的事情。当访问...

浅析java内存管理机制

内存管理是计算机编程中的一个重要问题,一般来说,内存管理主要包括内存分配和内存回收两个部分。不同的编程语言有不同的内存管理机制,本文在对比C++和java语言内存管理机制的不同的基础上,浅析java中...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)