首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSFastEnumeration在使用ARC的C阵列上崩溃

NSFastEnumeration在使用ARC的C阵列上崩溃
EN

Stack Overflow用户
提问于 2012-11-02 04:27:29
回答 2查看 651关注 0票数 3

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

代码语言:javascript
复制
id __strong *_objs =  (id __strong *)calloc(16,sizeof(*_objs));
_objs[0] = @1;
_count++;

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

代码语言:javascript
复制
- (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一起崩溃:

代码语言:javascript
复制
for (id object in array){  // EXC_BAD_ACCESS
    NSLog(@"%@",object)
}

知道为什么吗?

如果您有CodeRunner,则here是一个可执行版本。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-02 05:00:29

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

代码语言:javascript
复制
state->mutationsPtr = (unsigned long *)size;

将其替换为有效的启动器指针(小心:下面的指针在您的场景中可能没有任何意义,但至少它修复了EXC_BAD_ACCESS):

代码语言:javascript
复制
state->mutationsPtr = (unsigned long *)&_count;
票数 4
EN

Stack Overflow用户

发布于 2013-03-13 07:48:51

@Jano以防您想要摆脱在Xcode (4.6)的最新版本中出现的编译器警告

代码语言:javascript
复制
   - (NSUInteger) countByEnumeratingWithState: (NSFastEnumerationState*)state
                               objects: (id __unsafe_unretained*)stackbuf
                                 count: (NSUInteger)len

因为它与objects:..stackbuf的原始原型不匹配

代码语言:javascript
复制
    - (NSUInteger) countByEnumeratingWithState: (NSFastEnumerationState*)state
                               objects: (__autoreleasing id *)stackbuf
                                 count: (NSUInteger)len

请参阅Automatic Reference Counting: Error with fast enumeration中的托德·莱曼斯回答

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13184961

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档