-1

このコードを実行してx is 11、コンソールに入ります。メソッドのスコープ外で変数の状態を変更することは、私にはブロックの動作のように見えます。それがブロックの仕組みですか?

- (void)viewDidLoad
{
    NSNumber *x = [NSNumber numberWithInt:5];
    [self doSomethingWithNumber:&x];
    NSLog(@"x is %@ \n",x);

}

- (BOOL)doSomethingWithNumber:(NSNumber**)aNumber
{
    *aNumber = [NSNumber numberWithInt:11];
    return YES;
}
4

2 に答える 2

1

あなたの例の非正統的な構文にもかかわらず、これはポイントを説明するためだけに考案されたものだと思いますが、それらが定義されているレキシカルスコープからキャプチャ状態をブロックすることは正しいです。内部の詳細については、ブロックの内部に関する Mark Dalrymple の 投稿をご覧ください。

通常、周囲のスコープからの変数には、ブロック内の値渡しのセマンティクスと__block修飾子による参照渡しのセマンティクスがあります。したがって、これは例外をスローするコンパイルしない(EDIT 2012-09-27 20-52-51) :

#import <Foundation/Foundation.h>

typedef int (^IntBlock)();

    int main(int argc, char *argv[]) {
        NSAutoreleasePool *p = [[NSAutoreleasePool alloc] init];

        int n = 5;
        IntBlock alwaysEleven = ^{ 
            n++; 
            printf("n inside the block: %d\n",n);
            return 11;
        };
        int d = alwaysEleven(n);
        printf("result = %d, n = %d", d,n);

        [p release];
    }

しかし、宣言__block int n = 5;した場合、そうではありません。

@leo は、ブロックの使用を開始することを提案しました。ブロックがどのように状態をキャプチャするか、およびキャプチャされた状態が存在する場所 ( までスタック上Block_copy()) に関心がある場合は、ドキュメントのブロック プログラミング トピックを読む価値があります。

于 2012-09-27T13:19:05.987 に答える
0

いいえ、それがポインタの仕組みです。ブロックを使って何かをしたい場合は、Apple のGetting Started with Blocksに従うか、Web 上の多くの優れたチュートリアルの 1 つに従ってください。

于 2012-09-27T11:57:26.987 に答える