Block(5):block 변수 및 객체
4233 단어 iOS 모바일 개발
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): 캡처 대상