gpt4 book ai didi

objective-c - NSFastEnumeration 在带有 ARC 的 C 数组上崩溃

转载 作者:搜寻专家 更新时间:2023-10-30 20:03:13 24 4
gpt4 key购买 nike

我正在初始化对象的 C 数组并设置第一个元素:

id __strong *_objs =  (id __strong *)calloc(16,sizeof(*_objs));
_objs[0] = @1;
_count++;

然后我使用 NSFastEnumeration 的以下实现:

- (NSUInteger) countByEnumeratingWithState: (NSFastEnumerationState*)state
objects: (id __unsafe_unretained*)stackbuf
count: (NSUInteger)len
{
NSUInteger size = _count;
NSInteger count;
state->mutationsPtr = (unsigned long *)size;
count = MIN(len, size - state->state);
if (count > 0)
{
IMP imp = [self methodForSelector: @selector(objectAtIndex:)];
int p = state->state;
int i;
for (i = 0; i < count; i++, p++) {
stackbuf[i] = (*imp)(self, @selector(objectAtIndex:), p);
}
state->state += count;
}
else
{
count = 0;
}
state->itemsPtr = stackbuf;
return count;
}

不幸的是,当我运行它时,它因 EXC_BAD_ACCESS 而崩溃:

for (id object in array){  // EXC_BAD_ACCESS
NSLog(@"%@",object)
}

知道为什么吗?

如果你有CodeRunner , here是可执行版本。

最佳答案

问题是 mutationsPtr 指向您不允许访问的内存地址 1(并且也不是 4 字节对齐的):

state->mutationsPtr = (unsigned long *)size;

将其替换为适合初学者的有效指针(注意:下面的指针在您的场景中可能毫无意义,但至少它修复了 EXC_BAD_ACCESS):

state->mutationsPtr = (unsigned long *)&_count;

关于objective-c - NSFastEnumeration 在带有 ARC 的 C 数组上崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13184961/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com