内存(MRC)

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

一、计数器的基本操作

1> retain : +1, 方法返回的是对象本身

2> release :-1

3> retainCount : 获得计数器

4> dealloc

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

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

2.概念

1> 僵尸对象 :所占用内存已经被回收的对象,僵尸对象不能再使用(有时会崩溃)

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

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

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

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

3.谁retain,谁release

4.谁alloc,谁release

尽量少使用类方法创建对象,因为此时是autorelease,于用户交互时自动释放

二、set方法的内存管理

1> set方法的实现

- (void)setCar:(Car *)car

{

if ( _car != car )

{

[_car release];

_car = [car retain];

}

}

2> dealloc方法的实现(不要直接调用dealloc)

- (void)dealloc

{

//绝对安全:

self.name = nil;

self.car = nil;

[super dealloc];

}

三、@PRoperty参数

1>OC对象类型

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

@property (nonatomic, retain) Car *car;

@property (nonatomic, retain) id car;

// 被retain过的属性,必须在dealloc方法中release属性

- (void)dealloc

{

self.car = nil;(注意:该语句等同于release原来的对象,然后对nil进行retain,对nil的任何操作没有作用)

[super dealloc];

}

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的对象

* 创建对象的时候不要直接使用类名,用selfinit的重写,即自定义构造赋值时应用self.car(注意,为点语法,set或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 release];

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

_car = [car retain];

}

}

3.dealloc方法的代码规范

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

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

- (void)dealloc

{

self.car = nil;

[super dealloc];

}conllection内存的管理:

collection就是NSArray,NSDictionary,NSSet...等容器类,会自主管理自己内部的元素。

加⼊入collection中的对象会被retain

移除出collection的对象会被release

collection被释放会对内部所有对象release

copy浅拷贝(copy),retain+1,多1指针指向该内存,数组、字典元素为浅拷贝

copy深拷贝(mutablecopy),retain不变,开辟一块新内存,retain由0到1.数组与字典其中的元素仍为浅拷贝

NSString *str = [[NSString alloc]init];

//可变、不可变字符串或数组、字典mutablecopy均为可变字符串或数组、字典

NSMutableString *str1 = [str mutableCopy];

NSLog(@"%p,%p",str,str1);

NSMutableString *str2 = [[NSString alloc]init];

//可变、不可变字符串或数组、字典copy均为不可变字符串或数组、字典

NSString *str3 = [str copy];

NSLog(@"%p,%p",str2,str3);

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航