Objective-C (블록)

이한솔·2024년 7월 30일

Objective-C 문법 🍎

목록 보기
5/12

블록

블록은 Objective-C에서 코드 조각을 캡슐화하여 전달하거나 저장할 수 있게 해주는 기능이다. 블록을 사용하면 코드 재사용이나 콜백이 가능하고, Swift의 클로저와 유사하다.
블록은 코드 실행이 완료된 후 자동으로 스택에서 사라지는 스택 블록과, 명시적으로 힙에 할당하여 장기적으로 사용할 수 있는 힙 블록이 있다. ^ 기호로 정의한다.

블록 정의

반환타입 (^블록이름)(매개변수1 타입, 매개변수2 타입, ...) = ^반환타입(매개변수1 이름, 매개변수2 이름, ...) {
    // 블록의 본문
    // 반환값이 필요한 경우 return 반환값;
};

스택 블록

stackBlock은 스택에 생성된다. exampleFunction이 종료되면 블록도 사라진다.

void exampleFunction() {
    void (^stackBlock)(void) = ^{
        NSLog(@"This is a stack block.");
    };
    stackBlock(); // 블록 호출
}

힙 블록

힙 블록은 copy 메소드를 사용하여 스택 블록을 힙으로 복사한 것이다. 이 블록은 exampleFunction이 종료된 후에도 메모리에 남아 있다. ARC로 메모리 관리를 할 때는 자동으로 메모리를 해제하지만, MRC를 사용할 때는 Block_copyBlock_release로 메모리 관리를 명시적으로 해야 한다.

void exampleFunction() {
    // 스택 블록 생성
    void (^stackBlock)(void) = ^{
        NSLog(@"This is a stack block.");
    };
    
    // 스택 블록을 힙으로 복사
    void (^heapBlock)(void) = [stackBlock copy];
    heapBlock(); // 블록 호출

    // 스택 블록은 함수 종료 후 사라지지만, heapBlock은 여전히 힙에 남아 있음
}


블록 사용

블록은 다양한 용도로 사용할 수 있으며, 종종 비동기 작업이나 콜백에서 유용하게 쓰인다.

#import <Foundation/Foundation.h>

// NSString * 타입을 매개변수로 받고 아무것도 반환하지 않는 completionBlock이라는 블록 타입 선언
typedef void (^CompletionBlock)(NSString *);

@interface MyClass : NSObject

// completionBlock 타입의 completion이라는 매개변수를 받고 아무것도 반환하지 않는 doSomethingWithCompletion이라는 메소드 선언
- (void)doSomethingWithCompletion:(CompletionBlock)completion;

@end


@implementation MyClass


// doSometingWithCompletion 메소드 구현 
- (void)doSomethingWithCompletion:(CompletionBlock)completion {
    NSString *result = @"Task Completed";
    
    // result라는 NSString을 completionBlock타입인 completion에 매개변수로 넣어 호출
    if (completion) {
        completion(result);
    }
}

@end


int main(int argc, const char * argv[]) {
    @autoreleasepool {
        MyClass *myObject = [[MyClass alloc] init];
        
        // MyClass 인스턴스 생성 후 doSomethingWithCompletion 메소드에 CompletionBlock 타입의 매개변수 넣어 호출
        // 이 블록은 result라는 문자열을 인수로 받아 출력
        [myObject doSomethingWithCompletion:^(NSString *result) {
            NSLog(@"%@", result); // 출력: Task Completed
        }];
    }
    return 0;
}


Swift / Objective-C 비교

Swift

함수

func method(num1: Int, num2: Int) -> Int {
    return num1 + num2
}

클로저

let add: (Int, Int) -> Int = { (num1: Int, num2: Int) -> Int in
    return num1 + num2
}

Objective-C

함수

- (int)add:(int)num1 
       with:(int)num2 {
    return num1 + num2;
}

블록

int (^add)(int, int) = ^int(int num1, int num2) {
    return num1 + num2;
};

0개의 댓글