본문 바로가기
개발 블로그/아이폰개발

[Objectvie-c 의 블록] objectvie c 블록[block] 1장.

by snapshot 2019. 11. 8.

이 글은 제가 공부했던 것을 정리 했을 뿐이니..혹시 제가 잘못 된 것을 알고 있다면 댓글로 꼭 알려주세요.!

 

Objective-c 블록(block)

먼저 objectvie-c(옵젝) 의 블록에 대해서 알아 보자. 

'iOS와 OS X의 메모리 관리와 멀티스레딩 기법" 에서는 블록은 '지역 변수와 함께 동작하는 익명 함수' 라고 정의를 내렸다. 

익명 함수란? 말 그대로 이름이 없는 함수를 말한다. 다른 언어에서는 클로저, 또는 람다라고도 말한다. 

 

 

      ^ 리턴 타입 (인자 목록) (표현)

예)  ^ int (int count) { return count + 1;}

 

이런식으로 표현이 된다. 

 

변수로 선언을 할 경우

 

int (^blk)(int) = ^(int count){return count +1}; (아무리 해도 적응이 안 됨)

 

 

우리가 쓰는 변수들을 보면 지역 변수, 함수 인자값, 정적 변수, 전역 변수 등 이 있는데 전역 변수는 함수 호출이 끝난 이후에도 값이 유지되고 어느 한 메모리의 영역에 저장된다. 

 

지역 변수, 함수 인자값과 같은 것은 함수의 호출이 끝나면 메모리에서 사라진다. 메모리에서 데이터영역, 스택영역, 힙 영역 에서 스택 영역에 해당되기 때문에 호출되고 끝나면 메모리에서도 사라진다. 

 

하지만 블록은 블록 주변을 캡쳐링 하기 때문에 스택영역에 있던 블록은 캡쳐(카피)가 되면서 힙으로 메모리 이동을 한다. 

 

블록과 메모리

https://popopo.tistory.com/148

 

[Objectvie-c 의 블록] objectvie c 블록[block] 2장 메모리 영역

"iOS와 OS X의 메모리 관리와 멀티스레딩 기법"에서는 블록은 Objectvice-C 객체라고 설명을 쭉~~해준다. 한번 읽어보시길.. 두번 읽어 봤는데 사실 5번 더 읽어 봐야겠다.. 객체이기 때문에 데이터 영역(_NSConcr..

popopo.tistory.com

 

 

int main()
{
	int dmy = 256;
	int val =10;
	const char *fmt = "val = %d\n";
	void (Ablk)(void) = A{printf(fmt,val);};
	val = 2;
	fmt = "These values were changed, val = %d\n";
	blk();
	return 0;
}

 

여기서 fmt와 val은 블록 리터럴 이전에 선언 되었지만 블록 안에서도 사용이 된다. 

결과는 어떨까?

 

var 와 fmt는 블록 리터널 후에 수정이 되었지만..

예상과 달리 print문은 "var = 2"가 나온다. 

 

왜??와이??왜??

이게 클로저와 정말 다른 점인데 블록 코딩은 자신 이전의 블록 선언된 것만 캡쳐가 된다. swift 에서는 흔히 value capture 라고 하던데..

 

그런데 swift와 같은 방식으로 reference capture 방식으로 될려면 __block 지시어를 사용해줘야 한다. 또는 변경도 block 코딩 안에서 캡쳐한 지역변수의 변경이 필요할때도 __ block 지시어가 필요

 

예)

int val = 0;
void (Ablk)(void) = A{val =1;}; blk();
printf("val = %d\n", val);

이렇게 해서 실행을 했을때는 

error: variable is not assignable (missing 一一block type specifier)

void (Ablk)(void) = {val = 1;};

이런 에러가 나온다 .

 

그래서 값을 수정하기 에러를 없애기 위해서는

__block int val = 0;
void (八blk)(void) = 八{val =1;}; blk();
printf("val = %d\n", val);

이런식으로 해줘야 한다. 

 

 

참고 문헌

"iOS와 OS X의 메모리 관리와 멀티스레딩 기법"

댓글