[objective-c] 블록구문
블록은 ^로 시작하는 구문. 구문 자체가 객체처럼 사용가능하게 하는데.. 함수포인터라고 생각해도 될 듯 싶다.
블록 구문을 변수로 선언
리턴형 (^블록변수이름)(타입,타입) = ^(타입 변수명,타입 변수명) {
}
// 정의
double (^multiplyTwoValues)(double, double) = ^(double first, double second) {
return first * second;
};
// 사용
double ret = multiplyTwoValues(first, second);
블록 구문 역시 함수포인터 처럼 typdedef로 정의해 두고, 일반 객체처럼 사용이 가능하다.
typedef int(^BlockTypeName)(int);
BlockTypeName block_name = ^(int param) {
int x = 0;
return x + param;
}
뭐 포인터니까 메쏘드건 어디든 사용이 가능하긴 한데, objective-c의 메소드 호출 형태가 아닌 c 언어의 모습이라 깔끔해 뵈지는 않는다.
-(int) func:(BlockTypeName)block{
int ret = block(5);
return ret;
}
// 일시적으로 사용하는 경우에는 그냥 별도의 블록명 없이 생성해 사용하면 된다.
-(void) func:(int (^)(int)) block {
}
블록 외부의 변수값은 복사되어 사용되므로, 기본적으로 읽기만 가능한데, 외부 변수 값을 변경할 필요가 있는 경우
해당 변수 선언시 __block 을 추가해 주면 된다.
__block int ret = 0;
반환값, 블록이름, 파라미터가 없는 경우 삭제 가능하다
^{
// 단순 블록
}