0%

桥式转换(bridge cast)

foundation 与 coreFoundation的桥接

1. 用__bridge桥接 NSArray -> CFArrayRef

1
2
3
4
NSArray *fArray = @[@1, @2, @3, @4, @5];
// __bridge本身的意思是 ARC仍然具备这个OC对象的所有权, ARC任然会帮助我们释放
CFArrayRef cfArray = (__bridge CFArrayRef)fArray;
NSLog(@"Size of aray = %li", CFArrayGetCount(cfArray));

2. 用__bridge_retained 桥接 NSArray -> CFArrayRef

1
2
3
4
// __bridge_retained 意味着ARC交出对象的所有权
cfArray = (__bridge_retained CFArrayRef)fArray;
NSLog(@"Size of aray = %li", CFArrayGetCount(cfArray));
CFRelease(cfArray); //手动释放内存

3. 用__bridge_transfer 桥接 CFArrayRef -> NSArray

1
2
// 使ARC获得对象的所有权
fArray = (__bridge_transfer NSArray*)cfArray;

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
const void* RetainCallback(CFAllocatorRef allocator, const void* value) {
return CFRetain(value);
}

void ReleaseCallback(CFAllocatorRef allocator, const void* value) {
CFRelease(value);
}

CFDictionaryKeyCallBacks keyCallbacks = {
0,
RetainCallback,
ReleaseCallback,
NULL, //copyDescription取值为NULL,采用默认实现
//equal和hash发布采用CFEqual和CFHash这二者采用的做法与NSMutableDictionary的默认实现相同
CFEqual, // CFEqual最终会调用isEqual方法
CFHash,
};

CFDictionaryValueCallBacks valueCallback = {
0,
RetainCallback,
ReleaseCallback,
NULL,
CFEqual,
};
// 用CFMutableDictionaryRef来创建NSMutableDictionary
- (void)createMutableDictionaryForCFMutableDictionaryRef {
CFMutableDictionaryRef aCFDicionary = CFDictionaryCreateMutable(NULL, 0, &keyCallbacks, &valueCallback);
NSMutableDictionary *anNSDictionary = (__bridge_transfer NSMutableDictionary *)aCFDicionary;
anNSDictionary[@"a"] = @123;
[anNSDictionary removeObjectForKey:@"a"];
}