1.toll-free bridged
Core Foundation和Foundation框架的一些數(shù)據(jù)類型是可以相互轉(zhuǎn)換的倦炒。這些可以相互轉(zhuǎn)換的數(shù)據(jù)類型稱為toll-free bridged
數(shù)據(jù)類型益涧。下表列出了可以相互轉(zhuǎn)換的類型:
- Data types that can be used interchangeably between Core Foundation and Foundation
2.轉(zhuǎn)換語義和生命周期語義
編譯器了解返回Core Foundation類型的Objective-C方法并遵循歷史的命名規(guī)則鹃觉。例如編譯器知道UIColor
的CGColor
方法返回的CGColorRef
對象是不被持有的。
編譯器并不自動(dòng)管理Core Foundation對象的生命周期鳞尔,通過使用Objective-C的轉(zhuǎn)換方法或者Core Foundation的宏來告訴編譯器Core Foundation對象的所有權(quán)語義。
-
__bridge
:轉(zhuǎn)移Objective-C和Core Foundation之間的指針早直,沒有所有權(quán)的轉(zhuǎn)移 -
__bridge_retained
或CFBridgingRetain
:將一個(gè)Objective-C指針轉(zhuǎn)換為一個(gè)Core Foundation指針寥假,并且將所有權(quán)轉(zhuǎn)移給開發(fā)者 -
__bridge_transfer
或CFBridgingRelease
:將一個(gè)非Objective-C指針轉(zhuǎn)換為一個(gè)Objective-C指針,并且將所有權(quán)轉(zhuǎn)交給ARC
下面的例子展示了上面部分關(guān)鍵字和宏的使用:
NSLocale *gbNSLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_GB"];
CFLocaleRef gbCFLocale = (__bridge CFLocaleRef)gbNSLocale;
CFStringRef cfIdentifier = CFLocaleGetIdentifier(gbCFLocale);
NSLog(@"cfIdentifier: %@", (__bridge NSString *)cfIdentifier);
// Logs: "cfIdentifier: en_GB"
CFLocaleRef myCFLocale = CFLocaleCopyCurrent();
NSLocale *myNSLocale = (NSLocale *)CFBridgingRelease(myCFLocale);
NSString *nsIdentifier = [myNSLocale localeIdentifier];
CFShow((CFStringRef)[@"nsIdentifier: " stringByAppendingString:nsIdentifier]);
// Logs identifier for current locale
下面的例子展示了Core Foundation內(nèi)存管理函數(shù)的使用霞扬,
- (void)drawRect:(CGRect)rect {
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
CGFloat locations[2] = {0.0, 1.0};
NSMutableArray *colors = [NSMutableArray arrayWithObject:(id)[[UIColor darkGrayColor] CGColor]];
[colors addObject:(id)[[UIColor lightGrayColor] CGColor]];
CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef)colors, locations);
CGColorSpaceRelease(colorSpace); // Release owned Core Foundation object.
CGPoint startPoint = CGPointMake(0.0, 0.0);
CGPoint endPoint = CGPointMake(CGRectGetMaxX(self.bounds), CGRectGetMaxY(self.bounds));
CGContextDrawLinearGradient(ctx, gradient, startPoint, endPoint,
kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation);
CGGradientRelease(gradient); // Release owned Core Foundation object.
}
3.參考文獻(xiàn)
提升代碼質(zhì)量最神圣的三部曲:模塊設(shè)計(jì)(謀定而后動(dòng)) -->無錯(cuò)編碼(知止而有得) -->開發(fā)自測(防患于未然)