2013-02-26 2 views
0

코드 :ARC를 사용하는 Objective-C에서 블록을 정의 할 때 컴파일러는 무엇을합니까?

X의 위치를 ​​스택에 비원 호에

__block int x = 0; 
int *pointerToX = &x; 
NSLog(@"x's location is on the stack: %p", &x); //stack 
int (^block)() = ^{ 
    x += 1; 
    return x; 
}; 
NSLog(@"x's location is on the %@: %p", (&x == pointerToX ? @"stack" : @"heap"), &x); 
block(); 
NSLog(@"x's location is on the %@: %p", (&x == pointerToX ? @"stack" : @"heap"), &x); 
block = [block copy];  
NSLog(@"x's location is on the %@: %p", (&x == pointerToX ? @"stack" : @"heap"), &x); 

: 0xbfffdba0

X의 위치는 스택이다 0xbfffdba0

X의 위치를 ​​스택에 : 0xbfffdba0

x의 위치는 힙에 있습니다. 0x7195860

아크

:

X의 위치는 스택이다 0xbfffdb70 X의 위치를 ​​스택에

: 0xbfffdb70 X의 위치를 ​​스택에

: 0xbfffdb70

X의 위치 힙에 있습니다 : 0x7195860

왜 differenc 전자는 호와 비 호를 출력합니까?

+1

유일한 차이점은 실행할 때마다 다를 수있는 스택의 메모리 주소입니다. –

+0

이것은 다음 질문과 매우 유사합니다. http://stackoverflow.com/questions/15082265/why-is-a-block-variable-is- 블럭이 복사되기 전에 힙으로 옮겨졌다. –

+0

@MartinR 동일합니다. @ Nikolai Ruhe의 대답을 얻었습니다. – gelosie

답변

3

참조 ARC의 documentation :

[...] 이러한 시맨틱 블록 포인터 타입의 값을 유지하기 위해 호출 될 때마다, 그것은 Block_copy 효과를 갖는다 [...]

관련 문제