프로그래밍/iOS,macOS

[objective-c] 블록구문

chance 2016. 10. 13. 12:04

블록은 ^로 시작하는 구문. 구문 자체가 객체처럼 사용가능하게 하는데.. 함수포인터라고 생각해도 될 듯 싶다.


블록 구문을 변수로 선언

리턴형 (^블록변수이름)(타입,타입) = ^(타입 변수명,타입 변수명) {


}


// 정의

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;


반환값, 블록이름, 파라미터가 없는 경우 삭제 가능하다

^{

// 단순 블록

}