ARC

關(guān)鍵字的描述
//strong: 用于表明該指針是一個(gè)強(qiáng)指針, 由它指向的對象不會(huì)被釋放. 描述一般的OC對象的時(shí)候, 使用strong. 但是在ARC下, 仍然可以使用retain, 但是編譯器在編譯的過程中, 會(huì)自動(dòng)把retain變?yōu)閟trong.
@property (nonatomic, strong)NSArray *array;
@property (nonatomic, retain)UILabel *label;
//使用基本數(shù)據(jù)類型和結(jié)構(gòu)體的時(shí)候, 會(huì)使用unsafe_unretained.
@property (nonatomic, assign)int age;
//unsafe_unretained: 和assign類似, 也不會(huì)對對象的內(nèi)存產(chǎn)生影響. 但是描述基本數(shù)據(jù)類型和結(jié)構(gòu)體如果使用assign的話, 系統(tǒng)會(huì)自動(dòng)編譯為unsafe_unretained這個(gè)關(guān)鍵字.
@property (nonatomic, unsafe_unretained)float weight;
//copy這個(gè)關(guān)鍵字在ARC下基本功能和MRC下是一樣,功能被保留.
@property (nonatomic, copy)NSString *name;
//weak: 在描述代理的時(shí)候, 或者在進(jìn)行XIB連線控件的時(shí)候, 通常是weak. 不會(huì)導(dǎo)致對象的引用計(jì)數(shù)+1;
//在描述delegate對象的時(shí)候, 一般不適用assign和unsafe_unretained, 就是因?yàn)閣eak除了不會(huì)讓對象的引用計(jì)數(shù)+1之后, weak還有一個(gè)特殊的功能, 當(dāng)一個(gè)對象被釋放的時(shí)候, 用weak修飾的指針會(huì)自動(dòng)置為nil.(可以防止野指針的出現(xiàn)), 一個(gè)空對象可以調(diào)用任何方法都不崩潰.
//unsafe_unretained: 通過它描述的指針, 一旦它指向的對象被釋放后, 指針不會(huì)自動(dòng)置為nil.
@property (nonatomic, weak)id delegate;
ARCdealloc方法的使用注意事項(xiàng)
#import "People.h"

@implementation People

//當(dāng)前類的dealloc方法, 會(huì)在當(dāng)前類的對象被釋放的時(shí)候被調(diào)用, 一般不要手動(dòng)的調(diào)用dealloc方法.
//dealloc方法不僅僅可以在MRC環(huán)境下使用, 使用時(shí)候注意, 在dealloc方法內(nèi)部需要添加[super dealloc].
//同樣也可以在ARC環(huán)境下使用, 注意, 不能方法內(nèi)部添加[super dealloc], 因?yàn)槲覀儾恍枰僬{(diào)用release, autorelease等方法了.
- (void)dealloc
{
    NSLog(@"people對象被釋放了");
}

@end

OC與C對象的互轉(zhuǎn)(以及他們的管理權(quán)限問題)
#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下的一個(gè)指針類型, 類似于Foundation下的id, 萬能指針, 可以指向任何對象.
    //__bridge: 是由OC對象轉(zhuǎn)化為C對象的一種方式, 使用這種方式, 就是在告訴編譯器, 只轉(zhuǎn)換類型, 不轉(zhuǎn)化對象內(nèi)存的管理權(quán)限.表明對象的內(nèi)存管理權(quán)限仍然在ARC手中.
    //void *CFPeople = (__bridge void *)people;
    
    //_CFPeople = (__bridge void *)people;
    //CFRetain(_CFPeople);
    
    
    //__bridge_retained: 告訴編譯器不僅僅轉(zhuǎn)化對象的類型, 同時(shí)讓對象的內(nèi)存管理權(quán)有Foundation下的ARC管理轉(zhuǎn)到Core Foundation下進(jìn)行手動(dòng)管理.
    //void *CFPeople = (__bridge_retained void *)people;
    
    //由于對象內(nèi)存的管理權(quán), 已經(jīng)轉(zhuǎn)到了Core Foundation下, 所以需要手動(dòng)調(diào)用CFRelease來釋放一個(gè)局部對象.
    //CFRelease(CFPeople);
    
    
    //全局變量的釋放
    //_CFPeople = (__bridge_retained void *)people;
    
    
    
    
    
    
    //漢字轉(zhuǎn)拼音
    NSMutableString *mutableString = [[NSMutableString alloc] initWithString:@"張三"];
    
    //轉(zhuǎn)化成Core Foundation對象
    CFMutableStringRef string = (__bridge CFMutableStringRef)mutableString;
    
    //調(diào)用漢字轉(zhuǎn)拼音的函數(shù)
    CFStringTransform(string, NULL, kCFStringTransformMandarinLatin, NO);
    
    //去音符
    CFStringTransform(string, NULL, kCFStringTransformStripDiacritics, NO);
    
    //轉(zhuǎn)化完成之后, 需要把Core Foundation對象重新轉(zhuǎn)化為OC對象
    mutableString = (__bridge NSMutableString *)string;
    
    NSLog(@"mutableString = %@",mutableString);
    
    
    
    
    //在ARC和MRC進(jìn)行混編的時(shí)候, 注意:
    //如果在ARC環(huán)境下, 使用支持MRC的文件, 需要給每一個(gè)文件配置-fno-objc-arc.
    //如果在MRC環(huán)境下, 使用支持ARC的文件, 需要給每一個(gè)文件配置-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
    //只轉(zhuǎn)換對象的類型, 不轉(zhuǎn)換對象的內(nèi)存管理權(quán)限.管理權(quán)仍然在Core Foundation下.
    //People *people = (__bridge People *)_CFPeople;
    
    //對象類型轉(zhuǎn)化之后, 需要手動(dòng)的對Core Foundation對象進(jìn)行CFRelease的操作.
    //CFRelease(_CFPeople);
    
    
    //_people = (__bridge People *)_CFPeople;
    
    
    
    //__bridge_transfer: 不僅僅轉(zhuǎn)化對象的類型, 同時(shí)把對象內(nèi)存的管理權(quán)限轉(zhuǎn)交給了ARC進(jìn)行管理.
    //接下的操作, ARC就開始管理這個(gè)OC對象了.
    //People *people = (__bridge_transfer People *)_CFPeople;
    
    
    //交換管理權(quán)到ARC手中 __bridge_transfer:對對象的引用計(jì)數(shù)-1.
    //_people = (__bridge_transfer People *)_CFPeople;
    
}

@end

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 以下是關(guān)于內(nèi)存管理的學(xué)習(xí)筆記:引用計(jì)數(shù)與ARC。iOS5以前自動(dòng)引用計(jì)數(shù)(ARC)是在MacOS X 10.7與i...
    啊左閱讀 4,608評論 0 17
  • ARC是一個(gè)編譯器特征,它提供了對OC對象自動(dòng)管理內(nèi)存。ARC讓開發(fā)者專注于感興趣的代碼和對象的關(guān)系,而不用考慮對...
    jiaoguifeng閱讀 555評論 0 1
  • OC的內(nèi)存管理以及MRC與ARC 內(nèi)存中的五大區(qū)域: 棧區(qū),堆區(qū),BBS段,數(shù)據(jù)段和代碼段,其中除了堆區(qū)以外,其他...
    晚照清舟閱讀 758評論 0 1
  • Cocoa內(nèi)存管理機(jī)制 (1)當(dāng)你使用new、alloc、copy方法創(chuàng)建一個(gè)對象時(shí),該對象的保留計(jì)數(shù)器值為1.當(dāng)...
    John_LS閱讀 2,816評論 0 6
  • 南門不是一扇門。南門是一座城。 當(dāng)然,作為一座城,哪能沒有門,南門城也是有門的。南門城只有一扇門,沒有名字。其實(shí)也...
    茶人老七閱讀 286評論 2 1