我正在尝试在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/