본문 바로가기

프로그래밍/iOS,macOS

[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;


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

^{

// 단순 블록

}

'프로그래밍 > iOS,macOS' 카테고리의 다른 글

오토레이아웃 이것저것 / Constraint / UITextView  (0) 2016.10.25
커스텀객체와 인터페이스빌더  (0) 2016.10.23
스토리보드 / XIB  (0) 2016.10.22
싱글톤  (0) 2016.10.19
코어 데이터 정리  (0) 2016.10.18
슬라이드메뉴  (0) 2016.10.16
UITableView / UICollectionView  (0) 2016.10.16
파일 가져오기  (0) 2016.10.16
뷰 에니메이션  (0) 2016.10.13
비동기 처리 ( GCD , NSOperation )  (0) 2016.10.13