一群程序猿的秘密基地首页投稿(暂停使用,暂停投稿)程序员

ARC

2016-06-06  本文已影响78人  i赵磊
关键字的描述
//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

上一篇下一篇

猜你喜欢

热点阅读