您的位置:首页 > 移动开发 > Objective-C

Objective-C入门16:内存管理

2015-09-22 16:30 423 查看
Objective-C入门16:内存管理

每个对象有一个整数值,这个整数值与对象本身关联,称为引用计数器

当某些地方需要使用这个对象时,可以将引用计数器加1,表示需要使用这个对象

使用完毕之后,将该对象的引用计数器值减1,表示该对象使用完毕

如果引用计数器的值为0时,表明没有地方再使用该对象,这是系统将销毁该对象,其所占内存被收回,以便重用

        

ARC  自动管理引用计数的(系统默认,当前实际开发 全部是用的是ARC

MRC  手动管理引用计数的

        

怎么去操作引用计数

1、什么时候让引用计数1

allocnewcopyretain 引用计数1

        

Person *XiaoMing = [ [ Person alloc ] init ] ;

[ XiaoMing retain ] ;

引用计数  是判断这个对象是否被消除的依据

使用 retain为了防止对象被销毁(引用计数为0的时候被销毁
)


      

NSLog(@"%ld" , XiaoMing.retainCount ) ;

        

release  使引用计数 -1

[XiaoMing release] ;

NSLog(@"%ld" , XiaoMing.retainCount ) ;

销毁对象的时候会调用 delloc

当引用计数为0的时候就会调用delloc

delloc 不可直接调用是系统自动调用的   

[XiaoMing release];

       

对象的引用计数为0(对象已经被销毁的时候)对象是一个野指针(没有指向任何东西的指针)

试用这个指针再去调用方法或者其他操作
会直接崩溃或者存在潜在危险(数据为空)

如果对象的引用计数为0就不要强制给这个对象 retain

不用咱们管理引用计数的有

1.分配在栈里面的基本数据类型、

2.不是咱们allocnewcopyretain这些操作的

谁分配
谁负责
释放

       

autorelease  延迟释放

经常和自动释放池配合使用

NSAutoreleasePool  自动释放池的类

也需要对自动释放池实例化对象release

NSAutoreleasePool *pool = [[ NSAutoreleasePool alloc ]init];

当不知道
什么时候对象不再需要使用可以使用 autorelease延迟释放

放到自动释放池里面

Person *gaoShan = [ [ [ Person alloc ] init ] autorelease ] ;

在自动释放池 生命周期结束的时候会触发 autorelease释放延迟释放的对象

[ pool release ] ;

        

 新写法 @autoreleasepool的生命周期

出了花括号
自动释放池
结束
会触发
花括号
里面所有的 autorelease

  @autoreleasepool {
           Person * ppppp = [ [ [Personalloc ]
init ]autorelease] ;
               } 

Person *yangXiuWang = [ [ Person alloc ] init ] ;

通过引用计数  来判断是否需要销毁这个对象

allocnewcopyretain引用计数+1

引用计数 -1
方法   release autorelease

[ yangXiuWang release ] ;

        

NSAutoreleasePool *pool = [ [ NSAutoreleasePool alloc ] init ] ;

写在自动释放池生命周期以内的
带有延时释放的对象
都会在释放池生命周期结束之后释放

Person *huluwa1 = [ [ [ Person alloc ] init ] autorelease ] ;

Person *huluwa2 = [ [ [ Person alloc ] init ] autorelease ] ;

Person *huluwa3 = [ [ [ Person alloc ] init ] autorelease ] ;

[ pool release ] ;     

@autoreleasepool 

{

Person *huluwa2 = [ [ [ Person alloc ] init ] autorelease ] ;

}

花括号结束之后就是新写
a450
自动释放池的生命周期结束的时候

变量的生命周期

局部变量的生命周期:定义的位置
直到定义存在的括号以内

        

全局变量的生命周期:在对象存在的时候就可以使用

        

分配在栈里的数据
不用程序员去管理

 分配在堆里的需要程序员去管理
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  objective-c 内存