我有一个指向Objective-C对象的数组.这些对象具有与之关联的排序键.我正在尝试使用qsort对指向这些对象的指针数组进行排序.但是,第一次调用比较器时,第一个参数指向数组中的第一个元素,但第二个参数指向垃圾,当我尝试访问其排序键时,给我一个EXC_BAD_ACCESS.
这是我的代码(转述):
- (void)foo:(int)numThingies {
Thingie **array;
array = malloc(sizeof(deck[0])*numThingies);
for(int i = 0; i < numThingies; i++) {
array[i] = [[Thingie alloc] initWithSortKey:(float)random()/RAND_MAX];
}
qsort(array[0], numThingies, sizeof(array[0]), thingieCmp);
}
int thingieCmp(const void *a, const void *b) {
const Thingie *ia = (const Thingie *)a;
const Thingie *ib = (const Thingie *)b;
if (ia.sortKey > ib.sortKey) return 1; //ib point to garbage, so ib.sortKey produces the EXC_BAD_ACCESS
else return -1;
}
Run Code Online (Sandbox Code Playgroud)
任何想法为什么会这样?
bbu*_*bum 10
问题有两个:
qsort的第一个参数需要是指向数组开头的指针
传递给sort函数的参数实际上是指向数据指针的指针
考虑这个工作代码:
int thingieCmp(const void *a, const void *b) {
NSObject *aO = *(NSObject **)a;
NSObject *bO = *(NSObject **)b;
if (aO.hash > bO.hash) return 1;
else return -1;
}
int main (int argc, const char * argv[]) {
NSObject **array;
array = malloc(sizeof(NSObject*)*20);
for(int i = 0; i < 20; i++) {
array[i] = [NSObject new];
}
qsort(array, 20, sizeof(NSObject*), thingieCmp);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
另外,比较功能由解析数据指针NSObject *aO = *(NSObject **)a和qsort函数采用array作为直接参数.
但是,所有这些都引出了为什么要打扰的问题?
NSArray非常擅长保存对象数组,并且非常方便地排序.在一般情况下,性能非常出色.如果性能分析表明它不是,您可以相对容易地优化它.
另请注意,我sizeof()在两个地方都使用了相同的类型.此外,const您的原始代码不是必需的.
| 归档时间: |
|
| 查看次数: |
2509 次 |
| 最近记录: |