objective c block에 대한 이해
block 정의 변수나 데이터 구조안에 담을 수 있다.
파라미터로 전달 할 수 있다. 반환값(return value)으로 사용할 수 있다.
할당에 사용된 이름과 관계없이 고유한 구별이 가능하다.
재사용해야하는 경우에는 클래스 기반의 Delegate을 사용고, 한번 사용할 로직이라면 보통 블럭을 사용 block 은 런타임에 생성되는 다이나믹 함수(Dynamic Function) 이다.
병렬처리나 비동기처리(Asyncronous Processing), 혹은 '함수형언어(Functional Language)'의 특징과 비슷하다.
예제
#import "SampleClass.h"
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
#pragma exam1
// myBlock은 함수 블럭 변수이고 그 다음에 등장하는 '^(int num)'은 블럭 타입의 함수를 의미한다
int multiplier = 7;
//함수블럭변수 = 블럭타입의 함수;
int (^myBlockVriable)(int) = ^(int myNum) {
return myNum * multiplier;
};
//호출
int result = myBlockVriable(11);
NSLog(@"result : %d" , result ); //result 77
#pragma exam2
//블럭 내부에서 블럭외부 참조만 할 수 있다. 읽을 수만 있지 쓸 수는 없다.
//int x = 123; //블럭 내부에서 쓰겠다하면 오류가 발생한다.
__block int x = 100; //블럭 내부에서 사용하겠다 선언.
void (^printXAndY)(int) = ^(int y) {
x = x + y; // error
printf(" x: %d , y:%d\n", x, y);
};
printXAndY(3);
#pragma exam3 - 배열에 블락삽입, 블락은 객체타입이다.
NSMutableArray *temArray = [[NSMutableArray alloc]init];
[temArray addObject:^(int i){
NSLog(@"결과는 %d 입니다." , i);
}
];
void (^c)(int) = ^(int i ){
NSLog(@"두번째 결과는 %d 입니다." , i);
};
[temArray addObject:c];
void (^b)(int) = temArray[0];
void (^d)(int) = temArray[1];
b(5); //결과는 5 입니다.
d(2); //두번째 결과는 2 입니다.
#pragma exam4 - 델리게이트 처럼 사용하기 (특정 작업이 끝났을때 자동으로 호출)
SampleClass *sampleClass = [[SampleClass alloc]init];
[sampleClass performActionWithCompletion:^{
NSLog(@"performActionWithCompletion 메소드가 호출 완료된 후 후처리 메소드 작동");
}];
/*
결과:
수행. ... ... ...
performActionWithCompletion 메소드가 호출 완료된 후 후처리 메소드 작동
*/
}
return 0;
}
sampleclass
#import <Foundation/Foundation.h>
//블록을 쉽게 사용하기위해서 타입 설정
typedef void (^CompletionBlock)(void);
@interface SampleClass : NSObject
-(void) performActionWithCompletion : (CompletionBlock)CompletionBlock;
@end
#import "SampleClass.h"
@implementation SampleClass
- (void)performActionWithCompletion:(CompletionBlock)CompletionBlock{
NSLog(@"수행 ... .... ... ");
//이 메소드가 호출된 후 후 처리 메소드가 자동으로 호출된 곳에서 실행이 된다.
CompletionBlock();
}
@end
'ios 뽀개기 > objective-c' 카테고리의 다른 글
AVFoundation을 이용한 녹음 재생하기 (0) | 2018.12.17 |
---|---|
이미지 자르기 + 제스쳐 + transparentview 예제 (0) | 2018.12.14 |
UIImagePickerController를 이용한 비디오 (0) | 2018.12.07 |
ios filemanager 관련 모듈 - 저장 삭제 이동 (0) | 2018.12.07 |
ios 사이드 메뉴 (0) | 2018.12.05 |
댓글