サーチ…


構文

  • 変数として:

    returnType(^ blockName)(parameterTypes)= ^ returnType(parameters){...};

  • プロパティとして:

    @property(非構造、コピー)returnType(^ blockName)(parameterTypes);

  • メソッドのパラメータとして:

    - (void)methodWithBlock:(returnType(^)(parameterTypes))ブロック名。

  • typedefとして:

    typedef returnType(^タイプ名)(parameterTypes);

    タイプ名blockName = ^ returnType(parameters){...};

UIViewアニメーション

[UIView animateWithDuration:1.0
    animations:^{
        someView.alpha = 0;
        otherView.alpha = 1;
    }
    completion:^(BOOL finished) {
    [someView removeFromSuperview];
}];

カラット「^」文字はブロックを定義します。たとえば、 ^{ … }はブロックです。具体的には、 "void"を返し、引数を受け付けないブロックです。これは、 " - (void)something;"のようなメソッドに相当しますが、コードブロックに関連付けられた固有の名前はありません。

引数を受け入れることができるブロックを定義することは、非常によく似ています。引数をブロックに与えるには、^(BOOL someArg、NSString someStr){...} *のようにブロックを定義します。ブロックをサポートするAPI呼び出しを使用する場合は、上記の例に示すように、特にアニメーションブロックまたはNSURLConnectionブロックの場合と同様のブロックを作成します。

カスタムメソッドのカスタム補完ブロック

1-独自のカスタムブロックを定義する

typedef void(^myCustomCompletion)(BOOL);

2カスタム補完ブロックをパラメータとするカスタムメソッドを作成します。

-(void) customMethodName:(myCustomCompletion) compblock{
    //do stuff
    // check if completion block exist; if we do not check it will throw an exception
    if(complblock)
       compblock(YES);
  }

3-メソッドのブロックの使い方

[self customMethodName:^(BOOL finished) {
if(finished){
    NSLog(@"success");
}
}];

キャプチャされた変数の変更

ブロックは、同じレキシカルスコープに現れた変数をキャプチャします。通常、これらの変数は "const"値として取り込まれます。

int val = 10;
void (^blk)(void) = ^{
    val = 20; // Error! val is a constant value and cannot be modified!
};

変数を変更するには、__blockストレージタイプ修飾子を使用する必要があります。

__block int val = 10;
void (^blk)(void) = ^{
    val = 20; // Correct! val now can be modified as an ordinary variable.
};


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow