use*_*374 3 objective-c nsarray cfarraybsearchvalues
这可能是一个重复的问题,但我已经浏览了这么多的博客和文档,但我仍然无法弄清楚什么是CFArray.
作为性能明智哪一个最好,何时使用以及哪种情况.请注意这个主题.
Core Foundation(CF来自名称)是Apple面向C语言的函数和数据类型集合.Cocoa(NS来自NextStep,Cocoa的祖先)是Apple的Objective-C框架.
两个框架中的某些类型是免费桥接的 - 这意味着数据结构在两个框架之间共享,Core Foundation使用C风格的函数调用对其进行操作,Cocoa使用Objective-C样式方法调用对其进行操作.
有时一个框架可能提供另一个框架没有的操作,但一般来说,在考虑免费桥接类型时,您使用Objective-C中的Cocoa和C中的Core Foundation.
ARC可以自动管理Cocoa对象,这是一个很大的优势.在Core Foundation中,您使用手动内存管理.Objective-C有许多"桥接"转换,当您转移ARC和手动Core Foundation调用之间的内存管理责任时,它会通知编译器.
鉴于它们是相同的数据结构,任何性能差异都归结为如果Cocoa方法只调用Core Foundation一个额外的调用级开销,等等.一般情况下你不应该关心这个,除非你已经确定了性能问题.
HTH
CFMutableArrayRef array = CFArrayCreateMutable(kCFAllocatorDefault, arraySize, &kCFTypeArrayCallBacks);
for (int i=0;i<arraySize;i++) {
CFStringRef string = CFBridgingRetain(@"This is an awesome string"); // CFStringCreateWithCString(kCFAllocatorDefault, "This is an awesome string", kCFStringEncodingUTF8);
CFArrayAppendValue(array, string);
CFRelease(string);
}
CFIndex count = CFArrayGetCount(array);
for (int i=0;i<count;i++) {
CFStringRef string = CFArrayGetValueAtIndex(array, i);
}
CFRelease(array);
Run Code Online (Sandbox Code Playgroud)
让我们看一下CFArray代码。在CoreFoundation版本中,我们首先通过CFArrayCreateMutable()函数调用创建一个可变的CFArray(CFMutableArray),并提供分配器,数组大小和回调函数。然后,我们建立了一个看起来非常传统的for循环,在数组上迭代由arraySize指示的时间(此数字将在我们的测试中更改)。然后创建一个字符串,并将其附加到数组中并释放。您可能会注意到,我们实际上创建了Objective-C字符串文字,并通过CFBridgingRetain()将所有权转移到CoreFoundation。这意味着ARC将不再为我们处理释放字符串,而必须使用CFRelease()显式地进行释放。一种替代方法是使用创建带有CoreFoundation调用CFStringCreateWithCString()的字符串(已注释掉),但是此方法要慢得多,我们有兴趣比较数组性能,而不是字符串分配性能。代码的第二部分将获取数组计数,设置另一个循环,并在每次迭代时获取索引处的值。实际上,我们对字符串不做任何事情。
NSMutableArray *container = [[NSMutableArray alloc] initWithCapacity:arraySize];
for (int i=0;i<arraySize;i++) {
NSString *string = @"This is an awesome string";
[container addObject:string];
}
NSUInteger count = [container count];
for (int i=0;i<count;i++) { // (NSString *string in container) {
NSString *string = container[i];
}
Run Code Online (Sandbox Code Playgroud)
在本质上,Objective-C Foundation的对等人非常相似,但是由于我们在ARC下,因此不需要CFRelease()。大部分代码都是不言自明的,因此我们将不对其进行详细介绍。但是要指出的一件事是,使用Foundation可以选择使用快速枚举,这实际上会为您带来一些性能提升,我们将在后面介绍。在常规的for循环旁边对此进行了注释。
| 归档时间: |
|
| 查看次数: |
1882 次 |
| 最近记录: |