關(guān)鍵字的描述
//strong: 用于表明該指針是一個強指針, 由它指向的對象不會被釋放. 描述一般的OC對象的時候, 使用strong. 但是在ARC下, 仍然可以使用retain, 但是編譯器在編譯的過程中, 會自動把retain變?yōu)閟trong.
@property (nonatomic, strong)NSArray *array;
@property (nonatomic, retain)UILabel *label;
//使用基本數(shù)據(jù)類型和結(jié)構(gòu)體的時候, 會使用unsafe_unretained.
@property (nonatomic, assign)int age;
//unsafe_unretained: 和assign類似, 也不會對對象的內(nèi)存產(chǎn)生影響. 但是描述基本數(shù)據(jù)類型和結(jié)構(gòu)體如果使用assign的話, 系統(tǒng)會自動編譯為unsafe_unretained這個關(guān)鍵字.
@property (nonatomic, unsafe_unretained)float weight;
//copy這個關(guān)鍵字在ARC下基本功能和MRC下是一樣,功能被保留.
@property (nonatomic, copy)NSString *name;
//weak: 在描述代理的時候, 或者在進行XIB連線控件的時候, 通常是weak. 不會導(dǎo)致對象的引用計數(shù)+1;
//在描述delegate對象的時候, 一般不適用assign和unsafe_unretained, 就是因為weak除了不會讓對象的引用計數(shù)+1之后, weak還有一個特殊的功能, 當一個對象被釋放的時候, 用weak修飾的指針會自動置為nil.(可以防止野指針的出現(xiàn)), 一個空對象可以調(diào)用任何方法都不崩潰.
//unsafe_unretained: 通過它描述的指針, 一旦它指向的對象被釋放后, 指針不會自動置為nil.
@property (nonatomic, weak)id delegate;
ARCdealloc方法的使用注意事項
#import "People.h"
@implementation People
//當前類的dealloc方法, 會在當前類的對象被釋放的時候被調(diào)用, 一般不要手動的調(diào)用dealloc方法.
//dealloc方法不僅僅可以在MRC環(huán)境下使用, 使用時候注意, 在dealloc方法內(nèi)部需要添加[super dealloc].
//同樣也可以在ARC環(huán)境下使用, 注意, 不能方法內(nèi)部添加[super dealloc], 因為我們不需要再調(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下的一個指針類型, 類似于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)化對象的類型, 同時讓對象的內(nèi)存管理權(quán)有Foundation下的ARC管理轉(zhuǎn)到Core Foundation下進行手動管理.
//void *CFPeople = (__bridge_retained void *)people;
//由于對象內(nèi)存的管理權(quán), 已經(jīng)轉(zhuǎn)到了Core Foundation下, 所以需要手動調(diào)用CFRelease來釋放一個局部對象.
//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進行混編的時候, 注意:
//如果在ARC環(huán)境下, 使用支持MRC的文件, 需要給每一個文件配置-fno-objc-arc.
//如果在MRC環(huán)境下, 使用支持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
//只轉(zhuǎn)換對象的類型, 不轉(zhuǎn)換對象的內(nèi)存管理權(quán)限.管理權(quán)仍然在Core Foundation下.
//People *people = (__bridge People *)_CFPeople;
//對象類型轉(zhuǎn)化之后, 需要手動的對Core Foundation對象進行CFRelease的操作.
//CFRelease(_CFPeople);
//_people = (__bridge People *)_CFPeople;
//__bridge_transfer: 不僅僅轉(zhuǎn)化對象的類型, 同時把對象內(nèi)存的管理權(quán)限轉(zhuǎn)交給了ARC進行管理.
//接下的操作, ARC就開始管理這個OC對象了.
//People *people = (__bridge_transfer People *)_CFPeople;
//交換管理權(quán)到ARC手中 __bridge_transfer:對對象的引用計數(shù)-1.
//_people = (__bridge_transfer People *)_CFPeople;
}
@end