Block 사용 시 고려 사항
등록 정보
block은 함수 대상으로 프로그램 실행 중 생성됩니다.실행할 때, Block은 창고 (stack) 에 생성되며, 창고에 분배된 다른 대상과 마찬가지로, 떠나는 것은 존재하지 않습니다.그래서 Block을 대상 속성으로 할 때copy라고 명시해야 합니다.
@property (nonatomic, copy) void(^block)();
__weak
Block 내부에서 Block 소유자를 인용할 때순환 인용을 방지하기 위해 weak에서 수식합니다.
일반weak 및strong은 쌍으로 나타납니다. Block에서 실행할 때 weak의 대상이 풀렸지만 Block에서 바로 풀리지 않을 경우 Block 내의 코드를 순조롭게 실행할 수 있습니다.
__weak typeof(self) wself = self;
void(^testBlock)() = ^(){
__strong typeof(wself) sself = wself;
};
여기에서 wself는 Block 안팎에서 같은 대상을 가리키지만 메모리 주소가 다르다. 왜냐하면 Block은 wself를 포획했을 때 그것을 복사하기 때문이다.
__block
Block 내에서 일부 대상을 수정해야 할 때 로 표시해야 합니다block. 이 없으니까.Block 표시된 변수는 Block의 개인 메모리로 복사됩니다. 있음Block에 표시된 변수입니다. 주소는 Block의 개인 메모리에 기록됩니다.그래서 안 썼어Block 수식의 변수는 Block 외의 값이 바뀌었습니다. 다시 Block을 실행할 때 내부에 있는 변수의 값은 변하지 않습니다.
성명
습관적으로 type으로 Block을 설명하지만, 때로는 결합을 풀기 위해 직접 쓰는 것이 편리하다.여러 장면의 예를 들면 다음과 같습니다.
- (NSString *)testA:(NSString * (^)(NSString *s))block {
NSString * (^blockA)(NSString *) = ^(NSString *paramA){
NSLog(@"%@",paramA);
return paramA;
};
blockA(@"blockA");
return block(@"test");
}
- (void)testB:(void (^)(void))block {
void (^blockB)(void) = ^{NSLog(@"B");};
blockB();
return block();
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.