블록은 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_copy와 Block_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;
}
함수
func method(num1: Int, num2: Int) -> Int {
return num1 + num2
}
클로저
let add: (Int, Int) -> Int = { (num1: Int, num2: Int) -> Int in
return num1 + num2
}
함수
- (int)add:(int)num1
with:(int)num2 {
return num1 + num2;
}
블록
int (^add)(int, int) = ^int(int num1, int num2) {
return num1 + num2;
};