5

AFAIK, __block은 블록 내부에서 변수가 선언 한 주소를 블록 내부에서 변경할 때 사용됩니다.ARC는 __block을 사용해야 할 때 알려 줄까요?

그러나 변수가 가리키는 값을 변경하지만 포인터가 그대로 유지되는 경우 어떻게해야합니까? 예 : NSMutableArray *array이 있고 블록 내에 [array addObject:object]을 처리하면 어떻게됩니까? 이 경우 포인터 array을 변경하지 않지만 포인터가 가리키는 값을 변경합니다. 따라서 NSMutableArray *array을 선언 할 때 여전히 __block을 사용해야합니까?

답변

19

변수의 값을 변경하는 경우에만 __block이 필요합니다.

e.e. 당신이있는 경우 :

NSArray* foo; 

당신이 foo의 값을 변경하는 경우에만 __block이 필요합니다. 이제 foo은 "NSArray"이라는 형식의 포인터 일뿐입니다. 나는. foo은 실제로 플랫폼에 따라 64 비트 또는 32 비트 정수입니다. 해당 정수를 변경하면 __block이 필요합니다. 그렇지 않으면 __block이 필요하지 않습니다.

foo의 값을 실제로 변경하지 않으므로 __block을 호출하지 않아도 배열에서 addObject:을 호출 할 필요가 없습니다.

foo = (expression);과 같은 작업을 수행하려는 경우 __block이 필요합니다.

+0

어떤 컴파일러 최적화에 대해 (가 주어진 실행 경로에 대해 "변화의 도메인을"정의하기 매우 어렵습니다 ...이 OO에서 동시 프로그래밍은 열심히 저주되는 이유 중 하나 있습니다) ? '__block'은 객체가 결코 바뀌지 않는다는 것을 암시하고, NSArray가 인라인 되었다면, 이후의 용량 호출은 잘못되었을 수도 있습니다. – Dani

+2

'__block'은 변수가 변경 될 수 있음을 나타냅니다. 변수가'__block'인지 const-copy인지 (디폴트는 그대로), 객체에 대한 메소드 호출은 영향을받지 않습니다. – bbum

+0

하지만 변수 (NSArray *)가 자체 속성 인 경우 어떻게됩니까? __block을 추가해야합니까? – Amnysia

관련 문제