블록은 ^로 시작하는 구문. 구문 자체가 객체처럼 사용가능하게 하는데.. 함수포인터라고 생각해도 될 듯 싶다.
블록 구문을 변수로 선언
리턴형 (^블록변수이름)(타입,타입) = ^(타입 변수명,타입 변수명) {
}
// 정의
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 |