"__block" 키워드는 무엇을 의미합니까?
정확히 무엇을 하는 것입니까?__block
목표-C 평균의 키워드?블록 내에서 변수를 수정할 수 있다는 건 알지만 알고 싶습니다만...
- 컴파일러에게 정확히 무엇을 알려주나요?
- 또 다른 효과가 있습니까?
- 그게 전부라면 애초에 왜 그것이 필요한가요?
- 서류에 있나요? (찾을 수가 없어요.)
블록 내에서 사용할 때는 컴파일러에 표시된 변수를 특별한 방법으로 처리해야 한다는 것을 알려줍니다.일반적으로 블록에서도 사용되는 변수와 해당 내용이 복사되므로 이러한 변수에 대한 수정 작업은 블록 외부에 표시되지 않습니다.로 표 된 경우시로 표시되어 때__block
블록 내부에서 수행된 수정 사항은 블록 외부에서도 볼 수 있습니다.
예제 및 자세한 내용은 Apple 블록 프로그래밍 항목의 __block 스토리지 유형을 참조하십시오.
중요한 예는 다음과 같습니다.
extern NSInteger CounterGlobal;
static NSInteger CounterStatic;
{
NSInteger localCounter = 42;
__block char localCharacter;
void (^aBlock)(void) = ^(void) {
++CounterGlobal;
++CounterStatic;
CounterGlobal = localCounter; // localCounter fixed at block creation
localCharacter = 'a'; // sets localCharacter in enclosing scope
};
++localCounter; // unseen by the block
localCharacter = 'b';
aBlock(); // execute the block
// localCharacter now 'a'
}
예에서는 두 가지 모두를 사용합니다.localCounter
그리고.localCharacter
블록이 호출되기 전에 수정됩니다.그러나 블록 내부에서는 다음에 대한 수정 사항만localCharacter
덕분에 볼 수 있을 것입니다.__block
은 수정할 수 .localCharacter
블록 밖에서 이 수정 사항을 볼 수 있습니다.
@bbum은 블로그 게시물에서 깊이 있는 블록을 다루며 __block 스토리지 유형을 다룹니다.
__block은 고유한 스토리지 유형입니다.
정적, 자동 및 휘발성과 마찬가지로 __block도 스토리지 유형입니다.컴파일러에 변수의 저장소를 다르게 관리해야 한다는 것을 알려줍니다.
...
그러나 __block 변수의 경우 블럭이 유지되지 않습니다.필요에 따라 보관하고 해제하는 것은 사용자에게 달려 있습니다.
...
사용 사례는 다음과 같습니다.__block
인수를 유지하지 않기 때문에 유지 주기를 피하기 위해 사용되기도 합니다.일반적인 예는 자아를 사용하는 것입니다.
//Now using myself inside a block will not
//retain the value therefore breaking a
//possible retain cycle.
__block id myself = self;
__block을 사용하지 않을 때는 블록이 변수(값별 호출)를 복사하므로 다른 곳에서 변수를 수정해도 블록에 변경 사항이 표시되지 않습니다.
__block은 블록이 변수에 대한 참조(참조별 호출)를 유지하도록 합니다.
NSString* str = @"hello";
void (^theBlock)() = ^void() {
NSLog(@"%@", str);
};
str = @"how are you";
theBlock(); //prints @"hello"
이 두 가지 경우 __block이 필요합니다.
블록 내부에서 변수를 수정하고 외부에서 볼 수 있을 것으로 예상하는 경우:
__block NSString* str = @"hello"; void (^theBlock)() = ^void() { str = @"how are you"; }; theBlock(); NSLog(@"%@", str); //prints "how are you"
블록을 선언한 후 변수를 수정하려는 경우 블록에 변경 사항이 표시될 것으로 예상됩니다.
__block NSString* str = @"hello"; void (^theBlock)() = ^void() { NSLog(@"%@", str); }; str = @"how are you"; theBlock(); //prints "how are you"
__block은 두 가지 방법으로 사용할 수 있는 스토리지 한정자입니다.
원래 변수의 어휘 범위와 해당 범위 내에서 선언된 블록 간에 공유되는 저장소에 변수가 있음을 나타냅니다.그리고 clang은 이 변수를 나타내는 구조를 생성하고 이 구조를 값이 아닌 참조로 사용합니다.
MRC에서 __block은 블록이 캡처하는 객체 변수를 유지하지 않도록 하기 위해 사용할 수 있습니다.이것이 ARC에서 작동하지 않도록 주의하십시오.ARC에서는 __weak을 대신 사용해야 합니다.
__block
범위 변수를 가변적으로 만드는 데 사용되는 스토리지 유형입니다. 보다 솔직히 이 지정자를 사용하여 변수를 선언하면 자세한 내용은 읽기 전용 복사본이 아닌 블록으로 참조가 전달됩니다. 자세한 내용은 iOS의 블록 프로그래밍을 참조하십시오.
이것이 당신에게 도움이 되기를 바랍니다.
다음과 같은 코드가 있다고 가정합니다.
{
int stackVariable = 1;
blockName = ^()
{
stackVariable++;
}
}
블록 내부의 스택 변수는 기본적으로 불변하기 때문에 "할당할 수 없습니다"와 같은 오류가 발생합니다.
을 추가하면 내부에서 가 됩니다.즉, __block(저장 수식자)을 추가하면 변수가 .__block int stackVariable=1;
블록 언어 사양:
새로운 블록 유형 외에도 로컬 변수에 대한 새로운 스토리지 한정자 __block도 소개합니다.[testme: 블록 리터럴 내의 __block 선언]__block 스토리지 한정자는 기존 로컬 스토리지 한정자인 auto, register 및 static에 대해 서로 배타적입니다.[testme] __block에 의해 검증된 변수는 할당된 스토리지에 있는 것처럼 작동하며 이 스토리지는 해당 변수를 마지막으로 사용한 후 자동으로 복구됩니다.구현은 스토리지가 처음에는 자동으로 지정되고 참조 블록의 Block_copy에 할당된(heap) 스토리지로만 "이동"되는 최적화를 선택할 수 있습니다.이러한 변수는 일반 변수와 마찬가지로 변형될 수 있습니다.
__block 변수가 Block인 경우 __block 변수가 할당된 스토리지에 있다고 가정해야 하며, 따라서 할당된 스토리지에도 있는 Block을 참조한다고 가정해야 합니다(Block_copy 작업의 결과라고 가정합니다).그럼에도 불구하고 구현이 블록에 초기 자동 스토리지를 제공하는 경우 Block_copy 또는 Block_release를 수행할 수 있는 프로비저닝이 없습니다.이는 잠재적으로 여러 스레드가 공유 변수를 업데이트하려고 시도하는 고유한 레이스 상태와 이전 값의 배치 및 새 값 복사와 관련된 동기화 필요성 때문입니다.이러한 동기화는 이 언어 사양의 범위를 벗어납니다.
__block 변수의 컴파일 대상에 대한 자세한 내용은 블록 구현 사양 섹션 2.3을 참조하십시오.
즉, 접두사가 되는 변수를 블록 내에서 사용할 수 있습니다.
언급URL : https://stackoverflow.com/questions/7080927/what-does-the-block-keyword-mean
'programing' 카테고리의 다른 글
문서 데이터베이스:중복 데이터, 참조 자료 등(특히 MongoDB) (0) | 2023.07.04 |
---|---|
데이터베이스의 보기를 업데이트할 수 있습니까? (0) | 2023.07.04 |
C#을 사용하여 MongoDB 고유 키 만들기 (0) | 2023.06.29 |
오라클 SQL 개발자에서 "읽기 호출에서 하나를 뺀 값"을 어떻게 해결할 수 있습니까? (0) | 2023.06.29 |
하나의 문에서 시퀀스에서 여러 NEXTVAL 쿼리 (0) | 2023.06.29 |