Block 사용 시 고려 사항

1401 단어

등록 정보


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();
}

좋은 웹페이지 즐겨찾기