이 글은 제가 공부했던 것을 정리 했을 뿐이니..혹시 제가 잘못 된 것을 알고 있다면 댓글로 꼭 알려주세요.!
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
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의 메모리 관리와 멀티스레딩 기법"
'개발 블로그 > 아이폰개발' 카테고리의 다른 글
[iOS 앱 내 구입] iOS 앱 내 결제 시스템을 구현하면서 필수 고려할 사항 정리 (2) | 2019.12.04 |
---|---|
[iOS] App Lifecycle( 앱 생명주기) (0) | 2019.11.27 |
[iOS DateFormatter Locale] Date->String Locale identifier 사용표 (0) | 2019.11.21 |
[swift Date, DateFormatter] Date->String , String->Date 일때 locale(identifier), TimeZone(abbreviation) 관계 (0) | 2019.11.21 |
[Swift Date] 예약과 유저에게 보여줘야 할 DateFormatter TimeZone 설정 (0) | 2019.11.20 |
[Objectvie-c 의 블록] objectvie c 블록[block] 2장 메모리 영역 (0) | 2019.11.08 |
frame 과 bounds 차이라면..? Swift, Xcode, iOS 개발 (0) | 2019.10.30 |
델리게이트(Delegate) 위임 패턴이란? (0) | 2019.10.23 |
ARC, 순환참조와 소유권 지시어 (iOS, xcode) (0) | 2019.10.22 |
iOS13 dark mode(다크모드) 설정시 xcode로 대응 방법 (0) | 2019.10.22 |
댓글