Objectvie-C : Block

준우·2024년 7월 25일

Objective-C 이야기

목록 보기
16/19
post-thumbnail

Block

Objective-C 의 Block 은 코드의 작은 단위로, 코드의 특정 부분을 캡슐화하여 다른 곳에서 실행할 수 있는 기능

블록은 익명 함수(= 클로저) 와 유사하며, 변수와 상태를 캡처할 수 있음.
블록은 주로 콜백(=callback), 비동기 작업, 반복 작업 등에 사용됨.

블록의 기본 문법

01 블록 정의

  • ^{} 구문을 사용하여 정의함.
  • 블록 변수는 ^ 키워드를 사용하여 선언함.
  • 블록은 값을 캡쳐할 수 있으며, 클로저라고도 함.

02 블록의 기본적인 형태

반환 타입 (^블록 이름) (매개변수);

void (^exampleFunction)(void);
// 리턴 값이 void, 블록 이름이 exampleFunction, 매개변수 void 

블록 함수 값 정의

exampleFunction = ^{
	NSLog(@"Hello World");
};

블록 함수 호출

exampleFunction();

03 블록의 특징

캡처링(Capturing)

  • 블록은 정의된 위치의 변수들을 캡처하여 사용할 수 있음.
  • 기본적으로 캡처된 변수는 읽기 전용이지만, __block 키워드를 사용하여 변경할 수 있음.

메모리 관리

  • 블록은 기본적으로 스택에 할당됨. 하지만, 블록이 복사되면 힙에 할당됨.
  • Objective-C 의 ARC 는 블록의 메모리를 자동으로 관리함.

매개변수를 가지는 Block 형태

  • 매개변수 X, 반환 X 인 블럭함수 - 자료형
void (^simpleBlock)(void);
  • 매개변수 O, 반환 X 인 블럭함수
void (^blockWithParam)(NSString *);
  • 매개변수 여러개, 반환 X 인 블럭함수
void (^blockWithMultiParam)(NSString *, int);

매개변수를 가지는 Block 정의

  • 매개변수 X, 반환 X 인 블럭함수 - 자료형
simpleBlock = ^{
		NSLog(@"Hello World");
};
  • 매개변수 O, 반환 X 인 블럭함수
blockWithParam = ^(NSString * name) {
		NSLog(@"blockWithParam 호출됨 / name: %@", name);
};
  • 매개변수 여러개, 반환 X 인 블럭함수
blockWithMultiParam = ^(NSString * name, int age) {
		NSLog(@"blockWithMultiParam 호출됨 / name: %@ / age: %d", name, age);
};

매개변수를 가지는 Block 호출

  • 매개변수 O, 반환 X 인 블럭함수
[blockTest someFunctionWithParam: @"Hello World"];
  • 매개변수 여러개, 반환 X 인 블럭함수
[blockTest someFunctionWithMultiParams: @"Hello World" withAge: 10];

Optional Block(옵셔널 블록)

옵셔널 블록은 일반 블록과 동일하게 정의되지만, nil일 수 있다는 점에서 다름.

// __nullable 로 선택적으로 블럭 함수를 받을 수 있음.
- (void)someFunctionWithOptionalBlockParam:(void(^ __nullable)(NSString *))done;

- (void)someFunctionWithOptionalBlockParam:(void (^ __nullable)(NSString * _Nonnull))done
{
		NSLog(@"%s, line: %d, %@", __func__, __LINE__, @"");
		
		// 블록이 nil이 아닌 경우에만 실행
		if (done != nil) {
				done(@"완료 DoneBlock");
		}
}

[blockTest someFunctionWithOptionalBlockParam: nil];

0개의 댓글