gpt4 book ai didi

objective-c - 实现 NSFastEnumerator : EXC_BAD_ACCESS when iterating with for…in

转载 作者:可可西里 更新时间:2023-11-01 05:47:51 26 4
gpt4 key购买 nike

我有一个要枚举的数据结构。我尝试按如下方式实现对象的 NSFastEnumerator:

- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state 
objects:(__unsafe_unretained id [])buffer
count:(NSUInteger)len {

NSUInteger c = 0;
while (c < len) {
id obj = [self objectAtIndex:state->state];
if (obj == nil) break;
buffer[c] = obj;
c++;
state->state++;
}
state->itemsPtr = buffer;
state->mutationsPtr = nil;
return c;
}

如果我直接使用 objectAtIndex,我的对象可以正常工作。当索引不存在时,我得到一个 nil。但是当我使用 for 循环时:

for (Pin *pin in coll) { ... }

代码在上面的函数中运行良好,并用看起来有效的值填充状态并返回对象的数量,然后我在 for 语句本身遇到 EXC_BAD_ACCESS 失败。

我在这个实现中做错了什么?

最佳答案

我刚刚遇到了类似的问题,在仔细研究了 Apple 的 FastEnumerationSample 之后,这部分(我忽略了)跳到我身上:

// We are not tracking mutations, so we'll set state->mutationsPtr to point into one of our extra values,
// since these values are not otherwise used by the protocol.
// If your class was mutable, you may choose to use an internal variable that is updated when the class is mutated.
// state->mutationsPtr MUST NOT be NULL.
state->mutationsPtr = &state->extra[0];

重要的部分是:state->mutationsPtr 不能为 NULL。我只是使用了提供的示例行,它的效果非常好!

关于objective-c - 实现 NSFastEnumerator : EXC_BAD_ACCESS when iterating with for…in,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7115121/

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