作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试在 NSSet
实例上使用 CFSetGetValues()
,但它似乎正在破坏集合的内存。使用观察点,集合实例将从 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 模拟器中运行相同的代码时会失败。
最佳答案
调用CFSetGetValues()
时,需要从&objects
中删除&
。请注意,values
参数的类型为 const void **
,这意味着它是一个数组 (*),其中每个元素都是任意指针 (void *)。由于 objects
已经是一个数组,因此您不需要使用 &
运算符获取其地址。
如果数组是由函数分配的,那么使用 &
是有意义的,因此它的地址必须返回给被调用者。但事实并非如此,因为您负责分配数组。
关于cocoa - 为什么 CFSetGetValues 会破坏传递给它的 NSSet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16931611/
我尝试在 NSSet 实例上使用 CFSetGetValues(),但它似乎正在破坏集合的内存。使用观察点,集合实例将从 objc_assign_strongCast_non_gc() 写入。现在,我
我是一名优秀的程序员,十分优秀!