3

オブジェクトの 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をお持ちの場合は、ここに実行可能バージョンがあります。

4

2 に答える 2

4

問題は、mutationsPtrアクセスが許可されていない(そして、4バイト整列されていない)メモリアドレス1を指していることです。

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

初心者向けの有効なポインターに置き換えます(注意:以下のポインターはシナリオではまったく意味がない場合がありますが、少なくともEXC_BAD_ACCESSは修正されます)。

state->mutationsPtr = (unsigned long *)&_count;
于 2012-11-01T21:00:29.227 に答える
1

@Jano最近のバージョンのXcode(4.6)で表示されるコンパイラ警告を取り除きたい場合

   - (NSUInteger) countByEnumeratingWithState: (NSFastEnumerationState*)state
                               objects: (id __unsafe_unretained*)stackbuf
                                 count: (NSUInteger)len

オブジェクトの元のプロトタイプと一致しないため:..stackbuf

    - (NSUInteger) countByEnumeratingWithState: (NSFastEnumerationState*)state
                               objects: (__autoreleasing id *)stackbuf
                                 count: (NSUInteger)len

自動参照カウントのTodd Lehmansの回答を参照してください:高速列挙のエラー

于 2013-03-12T23:48:50.647 に答える