Rin*_*nat 33 objective-c ios automatic-ref-counting
我很困惑与bridge和bridge_transfer,这是正确的?
-(void)getData{
ABAddressBookRef addressBook = ABAddressBookCreate();
NSArray *allPeople = (__bridge_transfer NSArray*)ABAddressBookCopyArrayOfAllPeople(addressBook);
NSString *name;
for ( int i = 0; i < [allPeople count]; i++ )
{
name = (__bridge_transfer NSString *) ABRecordCopyValue((__bridge ABRecordRef)[allPeople objectAtIndex:i], kABPersonFirstNameProperty);
}
CFRelease(addressBook);
allPeople = nil;
}
Run Code Online (Sandbox Code Playgroud)
有没有人可以解释我如何使用它们?
He *_*ing 42
如果您启用了自动引用计数(ARC),则代码是正确的.
__bridge_transfer你的陈述中有两个.因此,创建的CFObjects的所有权将转移到NSObjects.如果您打开了ARC,它们将自动释放.如果您使用__bridge这两个语句,则需要显式调用CFRelease以释放API创建的CFObject *Copy.
该__bridge说法也是正确的.因为您在CF API中引用了NSObject.您没有转让所有权,因此ARC将其释放.
Poc*_*chi 19
它非常简单,当您使用ARC(自动引用计数)时,编译器将负责计算变量指向的对象数.当计数变为0时,对象将自动被处理.对于来自低级结构的东西,比如核心基础,编译器不知道该怎么做.所以你使用BRIDGE,如果你只想告诉编译器"忽略这个,我将在需要时释放它".如果你想说"将此作为一个对象处理并在引用变为0时释放它",则转换为桥接器.
执行此操作时,您创建的副本在正常情况下应由"CFRelease"释放:
ABAddressBookCopyArrayOfAllPeople(addressBook)
Run Code Online (Sandbox Code Playgroud)
但是,通过添加此项,您将所有权转移到objective-c对象:
NSArray *allPeople = (__bridge_transfer NSArray*)........
Run Code Online (Sandbox Code Playgroud)
所以NSArray将由ARC管理.
请注意,正如JRG所提到的,这样做:
CFRelease(addressBook);
Run Code Online (Sandbox Code Playgroud)
无论如何都不会影响新创建的对象,而是您仍然需要手动释放的原始对象:(很容易辨别,因为这些方法通常在其名称中包含create或copy关键字)
你的代码中没有发生的事情,但你应该小心的是释放与CFRelease为NULL的核心基础对象将导致错误.正如保罗在评论中提到的那样.
| 归档时间: |
|
| 查看次数: |
15269 次 |
| 最近记录: |