Block(5):block 변수 및 객체

4233 단어 iOS 모바일 개발
__block 설명자는 모든 종류의 자동 변수를 지정할 수 있습니다
ARC에서 id 유형과 대상 유형 변수는 소유권 수식자가 있어야 하며 기본값은strong, 따라서 __block id obj = [[NSObject alloc] init];
    __block __strong id obj = [[NSObject alloc] init];

이 코드는 터미널에서 clang을 통해 다음과 같이 변환됩니다.
static void __Block_byref_id_object_copy_131(void *dst, void *src) {
    _Block_object_assign((char*)dst + 40, *(void * *) ((char*)src + 40), 131);
}
static void __Block_byref_id_object_dispose_131(void *src) {
    _Block_object_dispose(*(void * *) ((char*)src + 40), 131);
}

/*__block       */
struct __Block_byref_object_0 {
  void *__isa;
__Block_byref_object_0 *__forwarding;
 int __flags;
 int __size;
 void (*__Block_byref_id_object_copy)(void*, void*);
 void (*__Block_byref_id_object_dispose)(void*);
 id object;
};

Block에서 을 사용하는 함수 두 개를 볼 수 있습니다.strong 수식 id 형식이나 대상 유형의 자동 변수, Block이 창고에서 무더기로 복사될 때_Block_object_assign: Block 캡처를 가진 대상_Block_object_dispose: Block 캡처를 방출하는 대상__block 의 경우strong 코스메틱block 변수 대상이 값을 부여받아 더미에 복사됩니다.Block 변수가 더미 위에 계속 존재하면 이 대상은 계속 보유된 상태에 있으며 Block에서 에 할당된 값을 사용합니다strong 수식의 대상 유형은 자동 변수의 대상과 같습니다.
을 사용하는 경우weak 수식 자동 변수는 어떻게 되나요?
typedef void(^blk_t)(id obj);
 blk_t blk;
    {
        //     __weak       ,   block   
        NSMutableArray *array = [[NSMutableArray alloc] init];
        id __weak array1 = array;
        blk = [^(id obj){
                [array1 addObject:obj];
                NSLog(@"array1 count %zd",[array1 count]);
            } copy];
       //       ,array   
    }
    blk([NSObject new]);
    blk([NSObject new]);
    blk([NSObject new]);

실행 결과
array1 count 0
array1 count 0
array1 count 0

왜냐하면strong 수식된array는 그 작용역이 끝날 때array1도 그에 대한 강력한 인용이 없기 때문에 방출, 소각되고array1 변수는nil로 자동으로 설정되며 를 제거하면weak은 다음과 같이 인쇄됩니다.
array1 count 1
array1 count 2
array1 count 3

만약Block 및weak 동시 사용은 결과 및 사용weak와 마찬가지로 array가 작용역을 초과하여 소각하는 것을 막을 수 없습니다.
__Block 및autoreleasing을 동시에 사용하면 컴파일 오류가 발생합니다. Block (1): Block은 무엇입니까?또 Block(二): Block 문법 정의는 Block(셋): Block의 실질은 Block(넷): Block 자동 변수를 포획하고 Block(여섯): Block 저장소와Block 변수 저장역 다시 보기 Block(7): 캡처 대상

좋은 웹페이지 즐겨찾기