2

我正在尝试CFSetGetValues()在一个NSSet实例上使用,但它似乎正在破坏集合的内存。使用观察点,正在将集合实例写入 from 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;
}

这是在 64 位 OS X 10.8 上。在 iOS 模拟器中运行相同的代码时会失败。

4

1 回答 1

3

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

如果数组是由函数分配的,那么使用它是有意义&的,因此它的地址必须返回给被调用者。但是,情况并非如此,因为您负责分配数组。

于 2013-06-05T05:45:36.353 回答