黑马程序员——Objective-c——内存管理

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


引用计数器的基本操作

1、方法的基本使用

 1> retain : 计数器+1,会返回对象本身

 2>release : 计数器-1,没有返回值

 3>retainCount : 获取当前的计数器

4>dealloc : 

 *当一个对象要被回收的时候,就会调用

 *一定要调用[super dealloc],这句调用要放在最后

2、概念

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

2>野指针:指向僵尸对象(不可用内存)的指针,给野指针发送消息会报错(EXC_BAD_ACCESS)

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

 

内存管理代码的规范

1、只要调用alloc,必须有release(autorelease),如果不是通过alloc,则不需要release(例:

NSString *s = @"abc";没有看见alloc,不需要release)

2、set的代码规范

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

- (void)setAge:(int) age

{

_age=age;

}

2>OC对象类型

- (void)setCar:(Car *) car

{

if( car != _car) // 1.先判断是不是传进来的对象

{

[_car release];  // 2.对旧对象做一次release

_car=[car retain]; // 3.对新对象做一次retain

}

}

3、dealloc方法的代码规范

 1>一定要[surper dealloc],而且放在最后

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

- (void)dealloc

{

[_car release];

[super dealloc];

}


autorelease

1autorelease的基本用法

 1>会将对象放到一个自动释放池中

 2>当自动释放池被销毁时,会对池子里的所有对象做一次release

 3>返回对象本身 Person *p = [[[ Person alloc ] init ] autorelease ];

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

 

2、autorelease的好处

 1>不用再关心对象释放的时间

 2>不用再关心什么时候调用release

 

3、autorelease的注意

 1>占用内存较大的对象不要随便使用autorelease,需要自己精确控制

 2>占用内存小的对象使用autorelease,没有太大影响

 3>系统自带的方法,如果不包含allocnewcopy,那么这些方法的返回对象都是已经autorelease过的。例:[NSString stringWithFormat:@”...”];[NSDate date];

 4>开发中经常写类方法快速创建一个autorelease的对象,创建对象的时候不要直接使用类名,用self。解决子类调用父类的类方法创建时,创建成了父类对象,而创建不出子类对象例:

+ (id) person

{

return [[[self alloc ] init ] autorelease];

}

 

 OCARC是编译器的特性(5.0之后强制ARC,不能调用内存相关的方法)

ARC的判断准则:只要没有强指针指向对象,就会释放对象

1、ARC的特点:

 1>不允许调用releaseretainretainCount

 2>允许重写dealloc,但是不允许调用[super dealloc]

 3>@property的参数

  *strong : 成员变量是强指针(适用于OC对象类型)

  *weak  : 成员变量是弱指针(适用于OC对象类型)

  *assign : 适用于非OC对象类型

 

指针分两种:

1>强指针 : 默认情况下,所有的指针都是强指针 __strong

2>弱指针 : __weak

ARC下 

__weak Person *p = [[Person alloc] init];  // 错误写法,没有意义的写法  刚创建,因为没有强指针指向对象,又被销毁

 

2、两端循环引用的时候,解决方案

 1>ARC   :一端用strong,一端用weak

 2>ARC: 一端用retain,一端用assign


------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值