OC中有关的内存泄露

来源:互联网 发布:阿姆斯特丹大学 知乎 编辑:程序博客网 时间:2024/06/05 04:50

一.什么是内存泄露

       一个对象不再使用,但是这个对象却没有被销毁,空间没有释放,则这个就叫做内存泄露.

二.管理的原则

    不再使用的对象必须销毁,释放内存.在Xcode5.0以前需要程序员手动释放内存,那样的工作量太大,而且还要对堆区的是如何的工作了如指掌,那样的工作效率不是很高.那么到了Xcode5.0之后我们没有必要担心,可以直接对程序的功能加强,这样能使得效率更高.那么Xcode5.0之前到底是怎么运作的呢?我们先来看看代码吧.
      
Person *per = [[Person alloc]init];Computer *computer = [[Computer alloc] init];
    那么我想先说说Xcode5.0之前程序员是如何释放的.首先,在内存当中计数器起到了加1或者减1的作用.上面这段代码就是在创建对象的时候计数器就由0加到1了.然后就是下面的代码了,也能使得计数器加或者减.
  
//[computer retain];//计数器加1
//[counter release];//计数器减1
   然后当每次遇到release的时候减1.并且调用下面这段代码.
   
-(void)dealloc{    代码块;   }

   当然最后当遇到下面这段程序的时候会完全释放.
 @autoreleasepool {代码块;
}

    上面这种内存泄露是Xcode5.0版本的时候手动做的事,那么在Xcode5.0之后就不需要程序员手动释放了,此时,Xcode会帮我们直接搞定这些事情.那么接下来我就告诉你们一个很好的办法,就算是我们自己手动管理也不怕了.我也称之为"搞定内存泄露三字经".
    
//谁引用,谁retain.
//谁引用,谁release.
//谁retain,谁release.
   是不是很容易就听懂啊,只要记住这三点,搞定一般的问题是没问题的.

三.解决循环引用中产生的内存泄露的问题.

    老规矩,什么是循环内存泄露呢?说的同通俗点就是一个对象中有定义了另外一个对象的指针,而且他们之间存在相互指向,当强指针和弱指针发挥作用的时候就会造成内存的泄露.这是我所理解的.那么到底弱指针和强指针到底是什么呢?
   
//__strong;强指针//__weak;弱指针
   这来个两个就是强指针和弱指针的表示方式.只有当两个对象之间有强和弱不同的指针的时候,才会使得内存的到释放.我们直接来看代码吧.
#import <Foundation/Foundation.h>@class Computer;//引用@interface Person : NSObject@property int age;//定义年龄@property (nonatomic,weak) Computer *cp;@end

  这是定义了一个Person的头文件.
#import <Foundation/Foundation.h>#import "Computer.h"#import "Person.h"int main(int argc, const char * argv[]) {    @autoreleasepool {        //创建对象per         __strong Person *per = [[Person alloc]init];        //创建对象computer         __strong Computer *computer = [[Computer alloc] init];                per.cp = computer;//赋值                computer.per = per;//赋值    }    return 0;}
    然后就是面最终要的一部分了,main函数.
//高性能,强引用,定义set/get方法@property(nonatomic,strong) Person *per;
    然后就是只有当两个函数中分别存在不同的强指针和弱指针,才会发挥他们的作用.那么我们来看看这段代码在内存是怎么指向的吧.由于上传不了图片,俺么这里我就用文字给大家描述吧.
                               Person对象
                              Computer指针      <----------------  *per                 
                                    *cp
                                    

                                   *cp 指向*per
                                  *per指向*cp这两块有相反的箭头


                               Computer对象
                                    Person指针   <-------------------*computer
                                    *per

由于当程序执行到了return 0上面的花括号,那么会使得*per和*computer释放,那么就会使得,指向两者的箭头消失,也就是*per和*computer释放了.但是由于Person和Computer两者存在相互的指向,那么由于强弱指针的作用,当弱指针的时候会值得指向Computer的这个对象释放,拿么,就剩下Person一个有强指针指向的对象了,那么,由于Computer也释放了,由于强指针自己的本质使得没有对象指向Person这块空间了,从而会使得他们两者都得到内存的释放.那么这就是循环之间的内存的释放.由于图的原因,可能讲得不是很好,希望大家多多包涵.
   可能有一部分我还没有考虑到,在这希望大家能给带你意见,一起交流交流.








   
1 0
原创粉丝点击