内存管理 2014-4-25总结


关于OC语言的内存管理


 一、计数器的基本操作

1、retain

 1>retain: +1

 2>release: -1

 3>retainCount: 获得计数器


 2.僵尸对象、野指针、空指针

 1>僵尸对象:所占用内存已经被回收的对象,僵尸对象不能再使用

 2>野指针:指向僵尸对象(不可用内存)的指针

 3>空指针:没有指向任何东西的指针(存储的东西是nil、NULL、0),给空指针发送消息不会报错

4>在最后最好让指针nil一次,确保无错误


3、方法

 1>你想使用(占用)某个对象,就应该让对象的计数器+1(让对象做一次retain操作)

 2>你不想再使用(占用)某个对象,就应该让对象的计数器-1(让对象做一次release操作)

 3>谁retain ,谁release 

 4>谁alloc , 谁release

 


 二、set方法的内存管理


/*

_speed:直接访问成员变量

self—>_speed:直接访问成员变量

self.speed   :set方法

[self speed]   :get方法

*/

 内存管理代码规范:

 1.只要调用了alloc,必须有release (autorelease)

   如果对象不是通过alloc产生的,就不需要release

 

 2.set方法的代码规范

 1>基本数据类型:直接复制

 - (void)setAge:(int)age

 {

    _age = age;

 }

 

 2>OC对象类型

 - (void)setCar:(Car *)car

 {

    //1.先判断是不是新传进来的对象

    if (car != _car)

    {

        //2.对旧对象做一次release

        _car = [car release];

 

        //3.对新对象做一次retain

        _car = [car retain];

    }

  }

 

 3.dealloc方法的代码规范

 1>一定要 [super dealloc],而且放到最后面

 2>对self(当前)所拥有的其他对象做一次release

 - (void)dealloc

 {

    [_car release];

    [super dealloc]; 

 }


 三、@property参数

/*

 @property的四种参数

 1.set方法内存管理相关的参数

  *retain:release旧值,retain新值(适用于OC对象类型)

  *assign:直接赋值(默认,适用于非OC对象类型)

  *copy:release旧值,copy新值

 

 2.是否要生成set方法

  *readwrite:同时生成setter和getter的声明、实现(默认)

  *readonly:只会生成getter的声明、实现

@property (nonatomic,assign,readwrite)int weight;

 

 3.多线程管理

  *nonatomic:性能高(一般就用这个)

  *atomic:性能低(默认)

 

 4.setter和getter方法的名称

  *setter:决定了set方法的名称,一定要有个冒号:

  *getter:决定了get方法的名称(一般用在BOOL类型)

//返回BOOL类型的方法名一般以is开头

@property (getter = isRich) BOOL rich;


 */

 1>OC对象类型

 @property (nonatomic,retain) 类名 *属性名;

 @property (nonatomic,retain) Car *car;

 @property (nonatomic,retain) id car;



 2>非OC对象类型 (int\float\enum\struct)

 @property (nonatomic,assign) 类型名称 属性名;

 @property (nonatomic,assign) int age;


 四、autorelease

 1.系统紫塞的方法中,如果不包含alloc、new、copy,那么这些方法返回的对象都是已经autorelease过的

 [NSString stringWithFormat:.....];

 [NSDate date];


 2.开发中经常写一些类方法快速创建一个autorelease的对象

 *创建对象的时候不要直接使用类名,用self



 //NSString NSNumber ......  前面NS代表作者名,NS代表Next Step这家公司



{// { 开始代表创建了释放池        

        //autorelease方法会返回对象本身

        //调用完autorelease方法后,对象的计数器不变

        //autorelease会将对象放到一个自动释放池中

        //当自动释放池被销毁时,会对池子里面的所有对象做一次release操作

 } // }结束代表销毁释放池


/*

 1.@class的作用:仅仅告诉编译器,某个名称是一个类

   @class Person; //仅仅告诉编译器,Person是一个类

 

 2.开发中引用一个类的规范

  1>在.h文件中用@class来声明类

  2>在.m文件中用#import来包含类的所有东西

 

 3.两端循环引用解决方案

  1>一端用retain

  2>一端用assign

 */



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值