ARC

关键字的描述
//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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容

  • 以下是关于内存管理的学习笔记:引用计数与ARC。iOS5以前自动引用计数(ARC)是在MacOS X 10.7与i...
    啊左阅读 4,561评论 0 17
  • ARC是一个编译器特征,它提供了对OC对象自动管理内存。ARC让开发者专注于感兴趣的代码和对象的关系,而不用考虑对...
    jiaoguifeng阅读 536评论 0 1
  • OC的内存管理以及MRC与ARC 内存中的五大区域: 栈区,堆区,BBS段,数据段和代码段,其中除了堆区以外,其他...
    晚照清舟阅读 714评论 0 1
  • Cocoa内存管理机制 (1)当你使用new、alloc、copy方法创建一个对象时,该对象的保留计数器值为1.当...
    John_LS阅读 2,773评论 0 6
  • 南门不是一扇门。南门是一座城。 当然,作为一座城,哪能没有门,南门城也是有门的。南门城只有一扇门,没有名字。其实也...
    茶人老七阅读 278评论 2 1