您的位置:首页 > 职场人生

黑马程序员———OC学习第五天(内存管理)

2015-04-16 23:43 302 查看
-------
Android培训、Java培训IOS培训.NET培训 期待与您交流! ----------

内存管理

1、什么是内存管理

移动设备的内存极其有限,每个app所能占用的内存是有限制的
当app所占用的内存较多时,系统会发出内存警告,这时得回收一些不需要在使用的内存空间。比如回收一些不需要使用的对象、变量等
管理范围:任何继承了NSObject的对象,对基本数据类型不需要管理内存

2、对象的销毁

当一个对象的引用计数器为0时,它将会被销毁,其所占用的内存被释放
当一个对象被销毁时,系统会自动向对象发送一条dealloc消息
一般会重写dealloc方法,在这里释放相关资源,dealloc就像是对象的遗言
一旦重写了dealloc方法,就必须调用[super dealloc]方法,并且放在最后
不要直接调用dealloc方法
一旦对象被回收,它所占用的内存就不再使用,坚持使用会导致程序崩溃(野指针错误EXC_BAD_ACCESS)

3、计数器的基本操作

retain:计数器+1
release: 计数器-1
retainCount:获取当前计数器个数

eg:

// ......

Person *p = [Person alloc] init]
// 获取当前计数器个数
int count = [p retainCount];
// 计数器+1
[p retain];
// 计数器-1
[p release];

// .....


4、set方法的内存管理

核心思想:release旧值,retain新值
eg:
// 假设人拥有Car对象,set方法
- (void)setCar:(Car *)car
{
// 判断是否是新车
if ( _car != car )
{
// release 旧值
[_car release];
// retain 新值,retain方法是有返回值的,返回值是它本身
_car = [car retain];
}
}


5、@property参数

set方法内存管理相关参数
是否生成set方法
多线程管理
setter和getter方法的名称

eg:
/*

1.set方法内存管理相关的参数
* retain : release旧值,retain新值(适用于OC对象类型)
* assign : 直接赋值(默认,适用于非OC对象类型)
* copy   : release旧值,copy新值

2.是否要生成set方法
* readwrite : 同时生成setter和getter的声明、实现(默认)
* readonly  : 只会生成getter的声明、实现

3.多线程管理
* nonatomic : 性能高 (一般就用这个)
* atomic    : 性能低(默认)

4.setter和getter方法的名称
* setter : 决定了set方法的名称,一定要有个冒号 :
* getter : 决定了get方法的名称(一般用在BOOL类型)
*/


6、atuorelease

atuorelease本身不加减对象引用计数器,只是将对象放到自动释放池中,当池子销毁的时候自动调用对象的release方法
系统自带创建对象的方法中,如果不包含alloc、new、copy,那么这些方法返回的对象都是已经atuorelease过的([NSString stringWithFormat:@"%d",100])
开发中经常写一些类方法快速创建一个atuorelease的对象(创建对象的时候不要直接使用类名,用self)

eg
@autoreleasepool{
// 创建一个atuorelease的对象
Person *p = [[[Person alloc] init] autorelease];

} // 池子销毁时自动调用[p release]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: