1. 블럭
코드 덩어리를 가리키는 변수
자비의 clouser, c++ 람다
변하지 않는 코드에서 변하는 코드를 블럭으로 분리할 수 있다.
인자가 없는 블럭은 ()생략 가능
전역 변수, static 지역변수, __block변수는 변수로서 포함됨
지역변수는 값(상수)로 변해서 블럭에 포함됨
Block_copy : 원래 스택영역에 만들어지는 블럭코드를 힙 영역으로 옮겨줌
함수에 블럭을 넘길 경우
블럭이 &(int a){NSLog(@"%d",a);} 라면 void(^b)(int)=^(int a){}; 이니 형은 void(^)(int)형이 된다.
따라서 함수에 쓰면 foo:((void)(^)(int))b 가 된다.
c++ 람다
- sort(x, x+10,[](int a, int b){return a<b;});
2. 샘플 코드
int Add(int a, int b)
{
printf("Add");
return a+b;
}
int main()
{
NSLog(@"add %d",Add(1,2));// 직접 호출
int(*f)(int, int) = &Add;
NSLog(@"add %d",f(1,2)); // 함수 포인터 호출
//블럭
int(^b)(int, int) = ^(int a, int b){return a+b;};
printf("%d\n",b(1,2)); //블럭변수사용호출
return 0;
}
3. 샘플코드 2
// 함수 인자로서의 블럭
void foo(int(^b)(int,int))
{
b(1,2);
}
@interface Car : NSObject
-(void)go:(int(^)(int,int))b;
@end
@implementation Car
-(void)go:(int (^)(int, int))b
{
b(1,2);
}
@end
int main()
{
Car* p1 = [Car alloc];
[p1 go:^(int a, int b) {
NSLog(@"블럭");
return a+b;
}];
foo(^(int a, int b) {
NSLog(@"블럭");
return a+b;
});
return 0;
}
'교육 > Objective-C' 카테고리의 다른 글
[Objective-C] kvo(key value observing) (0) | 2016.08.01 |
---|---|
[Objective-C] kvc(key value coding) (0) | 2016.08.01 |
[Objective-C] property (0) | 2016.07.26 |
[Objective-C] 메모리 관리 (0) | 2016.07.26 |
[Objective-C] init (0) | 2016.07.26 |