我正在尝试在CFSetGetValues()实例上使用NSSet,但似乎正在破坏该集的内存。使用观察点,已将设置实例从objc_assign_strongCast_non_gc()写入。现在,我对发生的事情一无所知。

int main(int argc, const char * argv[]) {
  @autoreleasepool {
    NSSet *set = [NSSet setWithObjects:@1, @2, @3, nil];
    const void *objects = calloc(set.count, sizeof(id));
    CFSetGetValues((__bridge CFSetRef)set, &objects);
    NSLog(@"Set %@", set); // *** set has been clobbered ***
  }
  return 0;
}


这是在OS X 10.8(64位)上。在iOS Simulator中运行时,相同的代码将失败。

最佳答案

调用&时,需要从&objects中删除​​CFSetGetValues()。请注意,values参数的类型为const void **,这意味着它是一个数组(*),其中每个元素都是任意指针(void *)。由于objects已经是一个数组,因此不需要使用&运算符获取其地址。

如果数组是由函数分配的,则使用&是有意义的,因此必须将其地址返回给被调用方。但事实并非如此,因为您负责分配数组。

关于cocoa - 为什么CFSetGetValues破坏传递给它的NSSet?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16931611/

10-10 22:37