본문 바로가기
ios 뽀개기/objective-c

objective c block에 대한 이해

by 인생여희 2018. 12. 10.
반응형

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





반응형

댓글