본문 바로가기

교육/Objective-C

[Objective-C] block

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