全球旧事资料 分类
一、前言对于大多数从C或者JAVA转过来学习ObjectC(以下简称OC)的人来说,OC这门语言看起来非常奇怪,用起来也有点麻烦。OC没有像JAVA一样的垃圾回收机制,也就是说,OC编程需要程序员手动去管理内存。这就是为什么它烦的原因,苹果却一直推崇开发者在有限硬件资源内写出最优化的代码,使用CPU最少,占用内存最小。
二、基本原理对象的创建:OC在创建对象时,不会直接返回该对象,而是返回一个指向对象的指针,因此出来基本类型以外,我们在OC中基本上都在使用指针。ClassAaClassA在ClassAalloci
it
alloc的时候,已经发送消息通知系统给ClassA的对象分配内存空间,并且返回
了指向未初始化的对象的一个指针。未初始化的ClassA对象接手到i
it消息,i
it返回指向已初始化后的ClassA对象的一个指针,然后将其赋值给变量a。在创建并使用完一个对象的时候,用户需要手动地去释放该对象。adealloc
如果指针a和b同时指向堆中同一块内存地址ClassAaClassAClassAbaadeallocalloci
it
当执行到第三行的时候,指针b就成了无头指针。这是一个在C中也是常见的错误,我们需要避免这类错误,因为无头指针是危险的。引用计数:OC在内存管理上采用了引用计数(retai
cou
t),在对象内部保存一个数字,用来表示被引用的次数。i
it、
ew和copy都会让retai
cou
t加1。当销毁对象的时候,系统不会直接调用dealloc方法,而是先调用release,让retai
cou
t减1,当retai
cou
t等于0的时候,系统才会调用dealloc方法来销毁对象。在指针赋值的时候,retai
cou
t是不会自动增加的,为了避免上面所说的错误,我们需要在赋值的时候手动retai
一次,让retai
cou
t增加1。ClassAaClassAClassAbaalloci
itretai
cou
t1
fba
retai
retai
cou
t2dealloc
这样在执行到第四行的时候,对象的retai
cou
t只是减了1,并没有被销毁,指针b仍然有效。
内存泄露:就如上面列子所示,当生成ClassA对象时,指针a拥有对该对象的访问权。如果失去了对一个对象的访问权,而又没有将retai
cou
t减至0,就会造成内存泄露。也就是说,分配出去的内存无法回收。ClassAaClassAa
ilalloci
it
三、AutoreleasePool为了方便程序员管理内存,苹果在OC中引入了自动释放池AutoreleasePool。在遵守一些规则的情况下,可以自动释放对象。但即使有这么一个工具,OC的内存仍需要程序员时刻关注(这个自动释放池跟JAVA的垃圾回收机制不是一回事,或者说,骑马都追不上JAVA的机制,可能连尘都吃不到)r
好听全球资料 返回顶部