2012-07-17 5 views
3

llvm-gcc-4.2를 사용하여 빌드 할 수 있도록 LLVM (iOS)에서 올바르게 작성된 기존 코드를 수정해야합니다.속성 선언의 __block 속성

@property (nonatomic, retain) __block id myProperty; 

내가 여기 의도는 self을 유지하지 않고 블록 내부에서 재산에 대한 액세스를 허용하는 것입니다 의심 : 나는 몇 군데에서 발견되는이 패턴을 제외하고 거의 모든 것을 수행하고있다. gcc가 여기에서 지원하지 않는 __block 속성을 제거하려면 어떻게합니까?

+0

나는 속성에'__block'을 필요로하지 않는다고 확신합니다. 스택에 할당 된 지역에 대해서입니다. 어쨌든, 그냥 시도해보십시오. 오류가 없다면 괜찮습니다. – nielsbot

+0

Clang 언어 사양 : "새로운 블록 유형 외에도 새로운 저장 장치 한정자 인 __block, ** 지역 변수 **를 도입했습니다." "cf. http://opensource.apple.com/source/clang/clang-137/src/tools/clang/docs/BlockLanguageSpec.txt – nielsbot

답변

12

난 당신이 컴파일러의 버그를 발견했습니다 선언을 제안합니다 :

@property (nonatomic, retain) __block id myProperty; 

은 의미가 없습니다. __block 한정자는 로컬 (스택 할당) 변수에 사용되므로 참조로 블록에 전달되므로 업데이트 할 수 있으며 일반적으로 스택이 아닌 힙에 저장됩니다.

따라서 한정자 __block은 Obj-C에서 항상 할당 된 힙인 객체 인스턴스와 관련된 속성 선언에 아무런 의미가 없습니다.

모든 컴파일러의 등록 정보 선언에서 __block을 삭제하면됩니다.

[*] 블록이 힙에 복사되지 않으면 컴파일러에서 __block 변수를 최적화하고 힙 블록을 힙으로 이동하지 않을 수 있습니다.

3

블록에서 변수를 사용하기 바로 전에 __block 유형의 로컬 포인터를 만듭니다. @property 선언에 __block을 사용하지 마십시오.

EG는 : TypeOfVariable __block *bock_pointer = self.property;

^{ inside the block use bock_pointer }

+0

예, 처음 생각 이었지만 다른 방법이 있는지 궁금합니다. (다른 속성 속성이나 gcc의 특정 __attribute __()를 통해) 아마도 ...? – user1530597

+1

블록에서 'self.property'를 사용하지 않는 이유는 무엇입니까? – skywinder

+0

블록에서 속성을 사용해야하는 이유는 무엇입니까? 설명하거나 설명을 해주십시오. – keisar