黑马程序员---【OC语言】06内存管理

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、基本介绍


使用范围:


任何继承了NSObject的对象,对基本数据类型无效

原理:


每个对象内部都保存了一个与之相关联的整数,称为引用计数器
当使用alloc、new或者copy创建一个对象时,对象的引用计数器被设置为1
给对象发送一条retain消息,可以使引用计数器值+1
给对象发送一条release消息,可以使引用计数器值-1
当一个对象的引用计数器值为0时,那么它将被销毁,其占用的内存被系统回收,系统也会自动向对象发送一条dealloc消息。
一般会重写dealloc方法,在这里释放相关资源。一定不要直接调用dealloc方法
可以给对象发送retainCount消息获得当前的引用计数器值

二、内存的管理原则


1、谁创建,谁释放。如果你通过alloc、new或(mutable)copy来创建一个对象,那么你必须调用release或autorelease。换句话说,不是你创建的,就不用你去释放
2、一般来说,除了alloc、new或copy之外的方法创建的对象都被声明了autorelease
3、谁retain,谁release。只要你调用了retain,无论这个对象是如何生成的,你都要调用release


三、@class的引入


1、通常引用一个类有两种办法


一种是通过#import方式引入;一种是通过@class引入

2、两种方式的区别


1>#import方式会包含被引用类的所有信息,包括被引用类的变量和方法;
2>@class方式只是告诉编译器在只是在.h文件中对class的声明,具体这个类里有什么信息,这里不需要知道,等实现的文件中真正要用到是,才会真正查看B类中的信息


四、autorelease pool(自动释放池)


1、基本介绍


自动释放池是OC里面的一种内存自动回收机制,一般可以将一些临时变量添加到自动释放池中,统一回收释放
当自动释放池销毁时,池里面的所有对象都会调用一次release方法
OC对象只需要发送一条autorelease消息,就会把这个对象添加到最近的自动释放池中(栈顶的释放池)
autorelease实际上只是把对release的调用延迟了,对于每一次autorelease,系统只是把该对象放入了当前的autoreleasepool中,当该pool被释放时,该pool中的所有对象会被调用Release


@autoreleasepool  
    {// { 开始代表创建了释放池  
          
        // autorelease方法会返回对象本身  
        // 调用完autorelease方法后,对象的计数器不变  
        // autorelease会将对象放到一个自动释放池中  
        // 当自动释放池被销毁时,会对池子里面的所有对象做一次release操作  
        Person *p = [[[Person alloc] init] autorelease];  
          
        p.age = 10;  
        @autoreleasepool  
        {  
            // 1  
            Person *p2 = [[[Person alloc] init] autorelease];  
            p2.age = 10;  
        }  
        Person *p3 = [[[Person alloc] init] autorelease];  
    } // } 结束代表销毁释放池  

2、autorelease pool使用注意


在ARC下,不能使用[[NSAutoreleasePool alloc] init],而应当使用@autoreleasepool
不要把大量循环操作放到同一个NSAutoreleasePool之间,这样会造成内存峰值的上升
尽量避免对大内存使用该方法,对于这种延迟释放机制,还是尽量少用
sdk中一般利用静态方法创建并返回的对象都是已经autorelease的,不需要再进行release操作

五、@property参数


默认格式:@property(参数1,参数2)类型名字;


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类型)


六、ARC


完全消除了手动管理内存的烦琐,编译器会自动在适当的地方插入适当的retain、release、autorelease语句。不再需要担心内存管理

ARC的规则:只要还有一个强指针变量指向对象,对象就会保持在内存中


强指针和弱指针


默认所有实例变量和局部变量都是Strong指针

弱指针指向的对象被回收后,弱指针会自动变为nil指针,不会引发野指针错误

使用注意:


1、不能调用release、retain、autorelease、retainCount
2、可以重写dealloc,但是不能调用[super dealloc]
3、@property : 想长期拥有某个对象,应该用strong,其他对象用weak
4、其他基本数据类型依然用assign
5、两端互相引用时,一端用strong、一端用weak


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值