黑马程序员-内存管理

来源:互联网 发布:入骨相思知不知 txt 编辑:程序博客网 时间:2024/05/18 14:44

黑马程序员

内存管理


一、基本概念


*范围:每个对象都有自己的引用计数器,是一个整数,表示“对象被引用的次数”。


*作用:当使用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

0 0
原创粉丝点击