Manual Reference Counting(简写MRC)多线程
调回手动内存管理要有下面的操做性能
引用计数器的基本操做
atom
1.方法的基本使用
1> retain :计数器+1,会返回对象自己
2> release :计数器-1,没有返回值
3> retainCount :获取当前的计数器
4> dealloc
* 当一个对象要被回收的时候,就会调用
* 必定要调用[super dealloc],这句调用要放在最后面
2.概念
1> 僵尸对象 :所占用内存已经被回收的对象,僵尸对象不能再使用
2> 野指针 :指向僵尸对象(不可用内存)的指针,给野指针发送消息会报错(EXC_BAD_ACCESS)
3> 空指针 :没有指向任何东西的指针(存储的东西是nil、NULL、0),给空指针发送消息不会报错
spa
多对象的内存管理.net
1.你想使用(占用)某个对象,就应该让对象的计数器+1(让对象作一次retain操做)
2.你不想再使用(占用)某个对象,就应该让对象的计数器-1(让对象作一次release)
3.谁retain,谁release
4.谁alloc,谁release
线程
set方法的内存管理指针
内存管理代码规范:
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
{
[_car release];
[super dealloc];
}
代码规范
@property参数对象
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类型)
内存
循环引用及@class
1.@class 的做用:仅仅告诉编译器,某个名称是一个类
@class Person; // 仅仅告诉编译器,Person是一个类
2.开发中引用一个类的规范
1> 在.h文件中用@class 来声明类
2> 在.m文件中用#import来包含类的全部东西
3.两端循环引用解决方案
1> 一端用retain
2> 一端用assign
autorelease
1.autorelease的基本用法
1> 会将对象放到一个自动释放池中
2> 当自动释放池被销毁时,会对池子里面的全部对象作一次release操做
3> 会返回对象自己
4> 调用完autorelease方法后,对象的计数器不变
2.autorelease的好处
1> 不用再关心对象释放的时间
2> 不用再关心何时调用release
3.autorelease的使用注意
1> 占用内存较大的对象不要随便使用autorelease
2> 占用内存较小的对象使用autorelease,没有太大影响
6.自动释放池的建立方式
1> iOS 5.0前
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[pool release]; // [pool drain];
2> iOS 5.0 开始
@autoreleasepool
{
}
1.官方内存管理原则
1> 当调用alloc、new、copy(mutableCopy)方法产生一个新对象的时候,就必须在最后调用一次release或者autorelease
2> 当调用retain方法让对象的计数器+1,就必须在最后调用一次release或者autorelease
2.集合的内存管理细节
1> 当把一个对象添加到集合中时,这个对象会作了一次retain操做,计数器会+1
2> 当一个集合被销毁时,会对集合里面的全部对象作一次release操做,计数器会-1
3> 当一个对象从集合中移除时,这个对象会一次release操做,计数器会-1
3.广泛规律
1> 若是方法名是add\insert开头,那么被添加的对象,计数器会+1
2> 若是方法名是remove\delete开头,那么被移除的对象,计数器-1