ARC

作者: i赵磊 | 来源:发表于2016-06-06 12:54 被阅读78次
    关键字的描述
    //strong: 用于表明该指针是一个强指针, 由它指向的对象不会被释放. 描述一般的OC对象的时候, 使用strong. 但是在ARC下, 仍然可以使用retain, 但是编译器在编译的过程中, 会自动把retain变为strong.
    @property (nonatomic, strong)NSArray *array;
    @property (nonatomic, retain)UILabel *label;
    //使用基本数据类型和结构体的时候, 会使用unsafe_unretained.
    @property (nonatomic, assign)int age;
    //unsafe_unretained: 和assign类似, 也不会对对象的内存产生影响. 但是描述基本数据类型和结构体如果使用assign的话, 系统会自动编译为unsafe_unretained这个关键字.
    @property (nonatomic, unsafe_unretained)float weight;
    //copy这个关键字在ARC下基本功能和MRC下是一样,功能被保留.
    @property (nonatomic, copy)NSString *name;
    //weak: 在描述代理的时候, 或者在进行XIB连线控件的时候, 通常是weak. 不会导致对象的引用计数+1;
    //在描述delegate对象的时候, 一般不适用assign和unsafe_unretained, 就是因为weak除了不会让对象的引用计数+1之后, weak还有一个特殊的功能, 当一个对象被释放的时候, 用weak修饰的指针会自动置为nil.(可以防止野指针的出现), 一个空对象可以调用任何方法都不崩溃.
    //unsafe_unretained: 通过它描述的指针, 一旦它指向的对象被释放后, 指针不会自动置为nil.
    @property (nonatomic, weak)id delegate;
    
    ARCdealloc方法的使用注意事项
    #import "People.h"
    
    @implementation People
    
    //当前类的dealloc方法, 会在当前类的对象被释放的时候被调用, 一般不要手动的调用dealloc方法.
    //dealloc方法不仅仅可以在MRC环境下使用, 使用时候注意, 在dealloc方法内部需要添加[super dealloc].
    //同样也可以在ARC环境下使用, 注意, 不能方法内部添加[super dealloc], 因为我们不需要再调用release, autorelease等方法了.
    - (void)dealloc
    {
        NSLog(@"people对象被释放了");
    }
    
    @end
    
    
    OC与C对象的互转(以及他们的管理权限问题)
    #import "ViewController.h"
    #import "People.h"
    
    @interface ViewController ()
    {
        void *_CFPeople;
        People *_people;
    }
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        People *people = [People new];
        
        //OC-->C: __bridge, __bridge_retained
        //void *: Core Foundation下的一个指针类型, 类似于Foundation下的id, 万能指针, 可以指向任何对象.
        //__bridge: 是由OC对象转化为C对象的一种方式, 使用这种方式, 就是在告诉编译器, 只转换类型, 不转化对象内存的管理权限.表明对象的内存管理权限仍然在ARC手中.
        //void *CFPeople = (__bridge void *)people;
        
        //_CFPeople = (__bridge void *)people;
        //CFRetain(_CFPeople);
        
        
        //__bridge_retained: 告诉编译器不仅仅转化对象的类型, 同时让对象的内存管理权有Foundation下的ARC管理转到Core Foundation下进行手动管理.
        //void *CFPeople = (__bridge_retained void *)people;
        
        //由于对象内存的管理权, 已经转到了Core Foundation下, 所以需要手动调用CFRelease来释放一个局部对象.
        //CFRelease(CFPeople);
        
        
        //全局变量的释放
        //_CFPeople = (__bridge_retained void *)people;
        
        
        
        
        
        
        //汉字转拼音
        NSMutableString *mutableString = [[NSMutableString alloc] initWithString:@"张三"];
        
        //转化成Core Foundation对象
        CFMutableStringRef string = (__bridge CFMutableStringRef)mutableString;
        
        //调用汉字转拼音的函数
        CFStringTransform(string, NULL, kCFStringTransformMandarinLatin, NO);
        
        //去音符
        CFStringTransform(string, NULL, kCFStringTransformStripDiacritics, NO);
        
        //转化完成之后, 需要把Core Foundation对象重新转化为OC对象
        mutableString = (__bridge NSMutableString *)string;
        
        NSLog(@"mutableString = %@",mutableString);
        
        
        
        
        //在ARC和MRC进行混编的时候, 注意:
        //如果在ARC环境下, 使用支持MRC的文件, 需要给每一个文件配置-fno-objc-arc.
        //如果在MRC环境下, 使用支持ARC的文件, 需要给每一个文件配置-objc-arc.
        
        
        
        
        
        
    
    }
    - (void)dealloc
    {
        
        NSLog(@"VC 被释放了");
        CFRelease(_CFPeople);
        
    }
    - (IBAction)btn:(id)sender {
        
    //    UIWindow *window = [[[UIApplication sharedApplication] delegate] window];
    //    window.rootViewController = nil;
        
        
        //C-->OC: __bridge, __bridge_transfer
        //只转换对象的类型, 不转换对象的内存管理权限.管理权仍然在Core Foundation下.
        //People *people = (__bridge People *)_CFPeople;
        
        //对象类型转化之后, 需要手动的对Core Foundation对象进行CFRelease的操作.
        //CFRelease(_CFPeople);
        
        
        //_people = (__bridge People *)_CFPeople;
        
        
        
        //__bridge_transfer: 不仅仅转化对象的类型, 同时把对象内存的管理权限转交给了ARC进行管理.
        //接下的操作, ARC就开始管理这个OC对象了.
        //People *people = (__bridge_transfer People *)_CFPeople;
        
        
        //交换管理权到ARC手中 __bridge_transfer:对对象的引用计数-1.
        //_people = (__bridge_transfer People *)_CFPeople;
        
    }
    
    @end
    
    

    相关文章

      网友评论

        本文标题:ARC

        本文链接:https://www.haomeiwen.com/subject/ljordttx.html