본문 바로가기

Dev.iOS/Objective-C

[Objective-C] 6. 블록(block)에 대해서

Chapter 6. 블록(Block)에 대해서

애플이 추가한 것으로 표준 ANSI C 정의에는 포함되지 않았다. 블록은 함수와 비슷하게 생겼고 동작도 유사하다. 함수에서처럼 인수를 넘길 수 있고, 블록에서 결과 값을 받는 것도 가능하다. 블록은 함수와 달리 정의한 함수나 메서드 안에서 정의할 수 있고, 자신과 동일한 범위에 있다면, 블록 바깥에서 정의된 변수에도 접근이 가능하다. ( 단, 값의 변경은 불가능 하다. ) 특별한 경우로 __block 변수를 통해서 변수의 값을 수정할 수 있긴 하다. 하지만 일부 변수는 __block으로 선언될 수 없는데, 가변 길이의 배열, 가변 길이의 배열을 포함하는 구조체가 해당된다.

블록은 함수와 메서드에 인수로 넘겨질 수도 있다. 블록의 장점 중 하나는 시스템이 블록을 애플리케이션이 사용하는 다른 프로세서나 스레드에서 실행되도록 분산 처리가 가능하다는 것이다. 쉬운 말로 하자면 동시실행(concurrent)의 의미로 받아들일 수 있겠다. 듣자하니 자바스크립트에서의 함수와 비슷하다고 느껴진다. 자바스크립트에서의 함수는 First-Class Citizen or First-Class Object 즉, 일급 객체이다. 함수가 인자로 전달될 수 있으며 함수 안에서 함수의 정의가 가능하다. 변수들의 스코프도 유사하다. 마치 클로저를 보는 듯하다. 그런데 클로져 ( Closure ) 라고도 한단다.

블록은 automatic과 managed, 이렇게 두 타입을 갖는다.
automatic은 스택 메모리를 사용하고, managed는 heap 메모리에 생성된다.

블록은 ^(캐럿 문자)로 시작한다.
그 뒤로 블록이 받는 인수 목록이 괄호 안에 나타난다.
ex>
<반환타입> (^블록이름)(인수목록) = ^(인수){
     (구현코드)
}
code>
1
2
3
void (^theBlock) () =  ^{
     NSLog(@“Hello Blocks!");
};
cs



블록 사용하기
블록은 변수처럼 선언하고 함수처럼 사용할 수 있다.
블록을 사용할 때는 캐럿 기호를 사용하지 않는다.
블록은 블록이 선언된 영역의 지역변수를 사용하려고 하는 경우에 함수 대신 사용한다.
블록이 만들어진 순간에 사용가는한 변수는 블록에서 접근가능하다는 특징을 이용하는 것이다.
블록이 선언되면 블록은 생성되는 순간 자신의 상태를 저장한다.

code>
1
2
3
4
5
6
int value = 6;
int (^multiply_block)(int number) = ^(int number){
     return (value * number);
};
int result = multiply_block(7);
printf(“Result = %d\n”, result);
cs

하지만 블록을 사용할 때, 대부분의 경우는 블록 변수를 만들 필요가 없다. 오브젝티브-C 에서는 블록도 일반 객체처럼 취급할 수 있다. 블록을 사용할 때 가장 큰 문제는 메모리 관리 문제가 발생할 수 있다는 것이기 때문에 주의해야 한다.




chapter 6. end