수색…
통사론
변수로 :
returnType (^ blockName) (parameterTypes) = ^ returnType (parameters) {...};
부동산으로서 :
@property (비 원자, 사본) returnType (^ blockName) (parameterTypes);
메서드 매개 변수로 :
- (void) methodWithBlock : (returnType (^) (parameterTypes)) blockName;
typedef로서 :
typedef returnType (^ TypeName) (parameterTypes);
TypeName blockName = ^ returnType (매개 변수) {...};
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.
};