ios中ARC模式下的内存管理

来源:互联网 发布:时时彩合买软件 编辑:程序博客网 时间:2024/06/07 01:46

#import <Foundation/Foundation.h>

#import "Person.h"

int main(int argc, const char * argv[]) {

    @autoreleasepool {

     

#if 0

        

        //ARC中,把强引用变成弱引用,将对象=nil就可以

        //ARC中判断的一指针是强引用还是弱引用根据__strong来判断,默认都是强引用

        

        NSArray * arr=[NSArray array];

        //相当于,只是省略了__strong

        NSArray * __strong array=[NSArray array];

        //因为在ARC中默认是有强引用指向

        

        //MRC下,用Personarc),Person中加上:-fobjc-arc.person中写代码要用arc格式

        

        //如果在ARC下,让Person这个类变成MRC,Person加上:-fno-objc-arc,在编写代码时,Person这个类下就要用mrc

        {

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

        }

        //person指针出这个作用域的时候,指针会变成弱引用,此时如果没有强引用指向,那么该对象会被销毁

        

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

        pers=nil;

        //ARC中,对象指向nil代表对象那条强引用的线指向nil,如果此时对象没有其他强引用指向,则该对象被销毁

        

#endif

        

#if 0

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

        NSLog(@"p1=%@",p1);

        

        p1=[[Person alloc]init];//当程序执行到此语句时,上面的p1被销毁,在arc下指向发生改变时,之前指向的线发生改变

        p1=nil;

        //当程序执行到这句,对象指为nil,程序被销毁

        

#endif

        

        Person * p1=[[Personalloc]init];

        

        Person * p2=p1;

        

        NSLog(@"%@",p1);

        

        p1=nil;

        

        NSLog(@"%@",p2);

        

        p2=nil;//把强引用变成弱引用

        //p1p2指向的都是同一块地址,p2指向p1指向的地址

              

        

      }

    return 0;

}




#import <Foundation/Foundation.h>

#import "Obj1.h"    

#import "Obj0.h"

int main(int argc, const char * argv[]) {

    @autoreleasepool {

#if 0

        Obj0 * obj0=[[Obj0 alloc]init];

      

        Obj1 * obj1=[[Obj1 alloc]init];

        

        [obj0 setOjb1:obj1];

        

        [obj1 setObjo:obj0];

        

        obj0=nil;

        

        obj1=nil;

        //此时set方法内部出现了内存泄漏,两个对象互相指向无法释放

        //因此需要在set方法内部加上__weak修饰,两个set方法都用__weak修饰

        

#endif

#if 0

        NSObject *__weak obj0=nil;//弱引用指向空,相对来说__weak是安全的

        {

        NSObject * obj=[[NSObject alloc]init];

        //强引用指向一块地址

            obj0=obj;

        //一个强引用一个弱引用共同指向一块空间

            NSLog(@"%@",obj0);

        }

        //当出obj的作用域时,强引用消失,此时再的印obj0对象为空

        NSLog(@"%@",obj0);

        //ARC中,指向一块空间的所有强引用消失以后,指针就指向nil

        //而在MRC中,当指向一块空间的所有强引用消失以后,指针的指向并不发生改变,此时再向对象发消息程序会崩溃

        //ARC中,一个对象无法将其他对象的指针变成弱引用,只能自己变自己

        

#endif

 

#if 0

        NSObject * __weak obj=[[NSObject alloc]init];

        NSLog(@"obj=%@",obj);

        //此时打印出来的对象是null,因为__weak修饰弱引用,创建一个对象后没有指针指向,使用__weak的前提是必须同时有一个强引用指向

        

#endif

        

        NSObject *__unsafe_unretained obj0=nil;

        //IOS4.0以前使用的__unsafe_unretained,用此修饰和MRC是一样的

        //__unsae_unretianed __weak的区别是,也都是一条绿线,但是另外一条和他指向同一块地址的红线不存在的时候,用__unsafe_unretained修饰的对象还是指向原来的空间,不会指向nil

        {

            NSObject * obj1=[[NSObjectalloc]init];

            obj0=obj1;

            NSLog(@"obj0=%p",obj0);

            

        }

        NSLog(@"obj0=%p",obj0);

        //此时打印的两个地址指向的空间是一样的

        NSLog(@"obj0=%@",obj0);

        //此时如果打印对象程序会崩溃,因为指针指向的空间里没有obj0这个对象,只不会是obj0的指针向这个空间而已。

        

    }

    return 0;

}




        //MRC下创建自动释放池的另一种方法

        NSAutoreleasePool * pool=[[NSAutoreleasePoolalloc]init];

        

        [pool release];

        //或者用

        [pool drain];

        

        //相当于

        @autoreleasepool {

            

            

        }


#import <Foundation/Foundation.h>

#import "Pig.h"

int main(int argc, const char * argv[]) {

    @autoreleasepool {

      

#if 0

        Pig * pig=nil;

        @autoreleasepool {

            pig=[[Pig alloc]init];

            NSLog(@"%@",pig);

        }

        NSLog(@"%@",pig);

 //此时程序pig的作用域是外面的pool,开始指向nil,后来变成强引用,再后打印两次,在没有出最外层的pool时都是强引用指向

#endif

    }

    

    

    @autoreleasepool {

        

        Pig * __autoreleasing pig=[[Pigalloc]init];

        //__autoreleasing修饰的对象指针相当于把它们加入自动释放池,当出了离他们最近的自动释放池的时候,对象对被一一销毁

        //如果不用__autoreleasing修饰出了自动释放池也会被销毁,但此时的销毁是因为出了对象的作用域

        NSLog(@"%@",pig);

    }

    

    //__autoreleasing,相当于autorelease经常用于工厂方法的中使用比如

    Pig * pig=[Pig pig];

    //pig里面实现的是

//    {

//        Pig * __autoreleasing pig=[[Pig alloc]init];

//        return pig;

//    }

    

    

    return 0;

}

0 0