Бесплатные соединенные мостом типы
Существует много типов данных в Базовой платформе Основы и платформе Основы, которая может использоваться взаимозаменяемо. Типы данных, которые могут использоваться взаимозаменяемо, также упоминаются как бесплатные соединенные мостом типы данных. Это означает, что можно использовать ту же структуру данных в качестве параметра Базовому вызову функции Основы или как получатель вызова сообщения Objective C. Например, NSLocale
(см. Ссылку класса NSLocale), является взаимозаменяемым ее Базовым дубликатом Основы, CFLocale (см. Ссылку CFLocale).
Не все типы данных бесплатные соединенный мостом, даже при том, что их имена могли бы предположить, что они. Например, NSRunLoop
не бесплатный соединенный мостом к CFRunLoop, NSBundle
не бесплатный соединенный мостом к CFBundle, и NSDateFormatter
не бесплатный соединенный мостом к CFDateFormatter. Таблица 1 обеспечивает список типов данных, поддерживающих бесплатное образование моста.
Кастинг и объектная пожизненная семантика
Посредством бесплатного образования моста, в методе, где Вы видите, например, NSLocale *
параметр, можно передать a CFLocaleRef
, и в функции, где Вы видите a CFLocaleRef
параметр, можно передать NSLocale
экземпляр. Также необходимо предоставить другую информацию для компилятора: во-первых, необходимо бросить один тип к другому; кроме того, Вам, вероятно, придется указать объектную пожизненную семантику.
Компилятор понимает методы Objective C, возвращающие Базовые типы Основы и следующие историческим соглашениям о присвоении имен Какао (см. Усовершенствованное Руководство по программированию управления памятью). Например, компилятор знает что, в iOS, CGColor, возвращенный CGColor
метод UIColor
не принадлежит. Необходимо все еще использовать надлежащий бросок типа, как проиллюстрировано этим примером:
NSMutableArray *colors = [NSMutableArray arrayWithObject:(id)[[UIColor darkGrayColor] CGColor]]; |
[colors addObject:(id)[[UIColor lightGrayColor] CGColor]]; |
Компилятор автоматически не управляет временами жизни Базовых объектов Основы. Вы говорите компилятор о семантике владения объектов с помощью любого бросок (определенный в objc/runtime.h
) или Базовый макрос Стиля основы (определенный в NSObject.h
):
__bridge
передает указатель между Objective C и Базовой Основой без передачи права собственности.__bridge_retained
илиCFBridgingRetain
бросает указатель Objective C на Базовый указатель Основы и также передает владение Вам.Вы ответственны за вызов
CFRelease
или связанная функция для отказа от владения объекта.__bridge_transfer
илиCFBridgingRelease
перемещает указатель неObjective C на Objective C и также передает владение ARC.ARC ответственен за отказ от владения объекта.
Некоторые из них показаны в следующем примере:
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 |
Следующий пример показывает использование Базовых функций управления памятью Основы, где продиктовано Базовыми правилами управления памятью Основы:
- (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. |
} |
Бесплатные соединенные мостом типы
Таблица 1 обеспечивает список типов данных, которые являются взаимозаменяемыми между Базовой Основой и Основой. Для каждой пары таблица также приводит версию OS X, в котором бесплатное образование моста между ними стало доступным.