Objective-c 内存管理-MRC 引用计数器

Objective-C提供了三种内存管理方式: 

 

 MannulReference Counting(MRC,手动管理,在开发 iOS4.1之前的版本的项目时我们要自己负责使用引用计数来管理内存,比如要手       动 retainreleaseautorelease ,而在其后的版本可以使用 ARC,让系统自己管理内存。 

automatic reference counting(ARC,自动引用计数,iOS5 之后推出的 

garbage collection(垃圾回收)iOS不支持垃圾回收; ARC作为苹果新提供的技术,苹果推荐开发者使用ARC技术来管理内存 


1)引用计数器:

       1.每个OC对象都有自己的引用计数器,对象刚被创建时,默认计数器值为1,当计数器的值变为0时,则对象回收(调用dealloc)。

       Objective - c计数器的方法

   - (NSUInteger)retainCountOBJC_ARC_UNAVAILABLE;
      2.对引用计数器的操作

  给对象发送消息,进行相应的计数器操作。 

 retain消息:使计数器+1,该方法返回对象本身

 语法:[对象名 retain]

 release消息:使计数器-1(并不代表释放对象)

 语法:[对象名 release]

 retainCount消息:获得对象当前的引用计数器值 %lu(计数器为 unsignedlong 类型 占8个字节)

#import <Foundation/Foundation.h>


@interface Temp : NSObject


@end


@implementation Temp


@end


int main(int argc,constchar * argv[]) {

    

   Temp * temp = [Tempnew];//引用计数器默认为1,

    

    [temp retain];//让引用计数器+1,所以为2

    [temp release];//让引用计数器-1,对应了retain

    

    [temp release];//让引用计数器-1 默认值为1,-1释放

    

   //引用计数器为0时释放

   return0;

}


(retain&release)

2)内存管理的原则 

1.原则: 

只要还有人在使用某个对象,那么这个对象就不会被回收; 只要你想使用这个对象,那么就应该让这个对象的引用计数器+1; 当你不想使用这个对象时,应该让对象的引用计数器-1;  

2.谁创建,谁release: 

(1)如果你通过alloc,new,copy来创建了一个对象,那么你就必须调用release或者 autorelease方法 

(2)不是你创建的就不用你去负责  

3.谁retain,谁release  

只要你调用了retain,无论这个对象时如何生成的,你都要调用release  

4.总结  

有始有终,有加就应该有减。曾经让某个对象计数器加1,就应该让其在最后-1.  


3)dealloc方法

      1.dealloc方法只有在计数器为0的时候被调用

  2.dealloc方法继承自NSObject(继承链接)

  3.dealloc方法作用是用来释放对象

           我们可以在跟据dealloc方法是否被调用得知一个对象是不是被释放了。

            永远不要直接通过对象调用dealloc方法(实际上调用可能并不会出错)

         一旦对象被回收了, 它占用的内存就不再可用, 坚持使用会导致程序崩溃(野指针错误)为 了防止调用出错,可以将“野指针”指向nil(0)。   

    重写dealloc方法

   要引用父类的deallo,而且要放到最后,因为创建的每个类都是从父类,根类继承来的,有很多实例变量也会继承过来,它们不会自动释放内存,需要调用父类的dealloc方法来释放,在此之前需要把当前类中的变量内存先释放掉,否则会造成当前本类中的内存积压,造成泄漏

#import <Foundation/Foundation.h>

@interface Temp : NSObject

@end

@implementation Temp

-(void)dealloc

{

    //成功释放时会输出

    NSLog(@"已经释放");

    //引用父类的dealloc

    [super dealloc];

}

@end

int main(int argc,constchar * argv[]) {

        Temp * temp = [Tempnew];

        [temp release];//让引用计数器-1

    

   //引用计数器为0时释放

    return 0;

}










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值