内存管理
一、基本概念
*范围:每个对象都有自己的引用计数器,是一个整数,表示“对象被引用的次数”。
*作用:当使用alloc、New或者copy创建一个新对象时,新对象的引用计数器默认为1。当一个对象的引用计数器为0时,对象占用的内存就会被系统回收。
*操作:当给对象发送一条retain消息,可以使引用计数器加1。// retain方法返回对象本身
当给对象发送一条release消息,可以使引用计数器减1。
@implementation Person
//name的setter内存管理和实现
- (void)setName:(NSString *)name
{
if(name!=_name)
{
[_name release];
_name=[name retain]; // retain方法返回对象本身
}
}
@end
*retainCount:获得当前对象的引用计数器值
*当一个对象被销毁时,系统会自动向对象发送一条dealloc消息。 // 判断对象有没有被回收,一般会重写dealloc方法,一旦重写dealloc方法,super的dealloc一定要调用而且放在最后
- (void)dealloc
{
[p release];
NSLog(@"对象被回收");
[super dealloc];
}
二、@property
定义:可以自动生成某个成员变量的setter和getter
@property的参数
1、setter内存管理相关的参数
1》retain:release旧值,retain新值(适用oc对象)
2》assign:直接赋值(默认,适用于非oc对象)
3》copy:release旧值、copy新值
2、是否要生成set方法
1》readwrite:同时生成set方法和get方法的声明和实现(系统默认)
2》readonly:只会生成get方法的声明和实现(即只读)
3、多线程管理
1》nonatomic:性能高(一般用这个)
2》atomic:性能低(系统默认)
4、setter和getter方法的名称
1》setter:决定了set方法的名称,一般要有个冒号
2》getter:决定了get方法的名称(一般用在BOOL类型)
@property(getter=isRich) BOOL rich; // 返回BOOL类型的方法名一般以is开头
Xcode4.0版本以前
@synthsize age=_age // 自动生成age的setter和getter的实现,并且会访问_age这个成员变量
//name的setter内存管理和实现
@interface Person:NSObject
//Xcode4.0版本以后会自动生成name的set方法和get方法的声明和实现,自动生成的set方法内存管理,自动生成成员变量_name(作用域为@private)
@property (nonatomic,retain) NSString *name;
@end
@implementation Person
@end
三、两端循环引用解决方案
1》一端用retain
2》一端用assign
例:每个人有身份证,每张身份证代表一个人
@interface Person:NSObject
@property (nonatomic,assign) Card *card;
@end
@implementation Person
@end
@interface Card:NSObject
@property (nonatomic,retain) Person *person;
@end
@implementation Person
- (void)dealloc
{
[_person release];
[super dealloc];
}
@end
四、autorelease
1、基本概念
1》autorelease会返回对象本身
2》autorelease会将对象放到自动释放池中,对象的计数器不变
3》当自动释放池被销毁时,会对池子里面的所有对象做一次release操作
2、操作
@autoreleasepool
{ // 代表创建了释放池
} // 代表销毁释放池
3、好处
1》不再关心对象释放的时间
2》不再关心什么时候调用release
4、使用注意
1》占用内存较大的对象不要随便使用autorelease
2》占用内存小的对象使用autorelease没有太大影响
3》不能精确的释放对象
@autoreleasepool
{
Person *p=[[[Person alloc] init] autorelease];
}
五、ARC
1、基本概念
1》判断准则:只要没有强指针指向对象,就会释放对象
2》强指针:默认情况下,所有的指针都是强指针__strong Person *p1
3》弱指针:__weak Person *p
2、ARC特点
1》不允许使用release,retain,retainCount
2》允许重写dealloc,但是不允许调用[super dealloc]
3》@property的参数
*strong:成员变量是强指针(适用于oc对象类型)
*weak:成员变量是弱指针(适用于oc对象类型)
*assign:适用于非oc对象类型
3、ARC的循环引用解决方案
一端用strong,一端用weak
黑马程序员-内存管理
最新推荐文章于 2015-03-15 10:11:16 发布