-1

コードは次のとおりです。

TrailLayer * layer = (TrailLayer*)[_layers objectAtIndex:(int)^{
    if (_segmentNumber < [_segmentArray count]) {
        return _segmentNumber;
    } else {
        return _segmentNumber - 1;
    }
}];

ここで何が問題なのですか?ここでは、_Variables はすべて IVAR です。Blocks を初めて使用するのですが、誰かがこの問題を特定するのを手伝ってくれますか? ここで EXC_BAD_INSTRUCTION を指定します。

ありがとう。

4

2 に答える 2

2

このコードを試してください。最初にブロックを書いindexて数値を取得し、その数値を使用して値を取得しますarray

int (^segmentIndex)(int) = ^(int segmentNumber){
        if (segmentNumber < [_layers count]) {
            return segmentNumber;
        } else {
            return segmentNumber - 1;
        }
};


NSLog(@"Trail Layer %@", [_layers objectAtIndex:segmentIndex(_segmentNumber)]);
TrailLayer * layer = (TrailLayer*)[_layers objectAtIndex:segmentIndex(_segmentNumber)];
于 2012-12-06T11:22:49.530 に答える
1

ブロックは、関数のような実行可能なものであり、基本的には、保存、受け渡し、後で実行できる (または実行できない) コードの一部です。に整数を渡したいobjectAtIndex:ので、ブロックを渡すことはまったく意味がありません。

ブロックを実行し、その結果を に渡すことを意図していた可能性がありますobjectAtIndex:。その場合、ブロックを実行する必要があります。

TrailLayer * layer = [_layers objectAtIndex:^{
    if (_segmentNumber < [_segmentArray count]) {
        return _segmentNumber;
    } else {
        return _segmentNumber - 1;
    }
}()]; // <-- run the block

ただし、すぐに実行するためだけにブロック (本格的なオブジェクトであり、多くの凝った処理を行う) を定義するのはちょっとばかげています。コードの一部を式として使用できるようにしたい場合は、GCC と LLVM の両方でサポートされている「ステートメント式」言語拡張を使用できます。

TrailLayer * layer = [_layers objectAtIndex:({
    int result;
    if (_segmentNumber < [_segmentArray count]) {
        result = _segmentNumber;
    } else {
        result = _segmentNumber - 1;
    }
    result;
})];

しかし、実際には、この場合は正規の C 条件式を実行する必要があります。

TrailLayer * layer = [_layers objectAtIndex:
                      _segmentNumber < [_segmentArray count] ?
                      _segmentNumber : _segmentNumber - 1];
于 2012-12-07T00:36:51.670 に答える