OC中有关的内存泄露

一.什么是内存泄露

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

二.管理的原则

    不再使用的对象必须销毁,释放内存.在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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值