iOS의block/__weak/__bridge 사용법 설명
3884 단어 iOS/oc
1.__bridge: CF와 OC 대상 전환 시 대상 유형만 관련되고 대상 소유권의 전환은 관련되지 않는다.
NSURL *url = [[NSURL alloc] initWithString:@"http://www.baidu.com"];
CFURLRef ref = (CFURLRef)url;
위의 코드는 ARC 환경에서 다음과 같이 오류 프롬프트와 오류 수정이 제공됩니다.
NSURL *url = [[NSURL alloc] initWithString:@"http://www.baidu.com"];
CFURLRef ref = (__bridge CFURLRef)url;
시스템이 자동으로 추가bridge, OC에서 만든 대상이고 변환할 때 대상 소유권의 변환이 없기 때문에 위의 코드는 CFRelease를 추가할 필요가 없습니다
2.__bridge_transfer: CF 대상이 OC 대상으로 전환될 때 CF 대상의 소유권을 OC 대상에게 맡기면 ARC가 자동으로 이 메모리를 관리할 수 있다.(CFBridgingRelease()
3.__bridge_retained: ( bridge transfer와 반대로) OC 대상을 CF 대상으로 전환할 때 OC 대상의 소유권을 CF 대상에게 맡겨 관리하는 데 자주 사용된다.(CFBridgingRetain()
NSURL *url = [[NSURL alloc] initWithString:@"http://www.baidu.com"];
CFURLRef ref = (__bridge_retained CFURLRef)url;
CFRelease(ref);
_bridge_retained , OC CF , ref CFRelease .
=========================================
__weak은 ARC 모드에서만 사용할 수 있고 대상(NSString)만 수식할 수 있으며 기본 데이터 형식(int)은 수식할 수 없습니다.
__weak __typeof(&*self)weakSelf =self; 과 같습니다.weak UIViewController *weakSelf =self;
__weak의 실현 원리
선언대상
{
id __weak obj = strongObj;
}
id __weak obj = strongObj;}
여기에서 strongObj가 선언된 객체라고 가정합니다.
LLVM을 해당 코드로 변환
id __attribute__((objc_ownership(none))) obj1 = strongObj;
objc_ownership(none))) obj1 = strongObj; 상응하는 호출
id obj ;
objc_initWeak(&obj,strongObj);
objc_destoryWeak(&obj);
; objc_initWeak(&obj,strongObj);
objc_destoryWeak(&obj);
objc_initWeak의 실현은 사실 이렇습니다.
id objc_initWeak(id *object, id value) {
*object = nil;
return objc_storeWeak(object, value);
}
object, id value) { *object = nil;
return objc_storeWeak(object, value);
}
전송된 Object를 0 또는 nil로 바꾸고 objc 를 실행합니다storeWeak 함수.
그럼 objcDestory Weak 함수는 무엇을 하는 것입니까?
objc_DestoryWeak 함수의 실현
void objc_destroyWeak(id *object) {
objc_storeWeak(object, nil);
}
object) { objc_storeWeak(object, nil);
}
또한 objc store Weak 함수를 호출합니다.objc init Weak과 objc destroy Weak 함수는 모두 objc store Weak 함수를 호출하는데 유일하게 다른 것은 호출된 인삼이 다르다는 것이다. 하나는value이고 하나는nil이다.
그럼 포인트는 Objc.storeWeak 함수에 있습니다.
objc store Weak 함수의 용도가 뚜렷합니다.weak표도Hashtable로 이루어졌기 때문에objc storeWeak 함수는 첫 번째 매개 변수의 변수 주소를 weak표에 등록한 다음 두 번째 인삼에 따라 제거 여부를 결정합니다.만약 두 번째 파라미터가 0이라면weak 변수는 weak표에서 기록을 삭제하고 인용 계수표에서 대응하는 키 값 기록을 삭제합니다.
그래서 만약weak 인용의 원 대상이 풀리면 대응하는weak 대상이 nil로 지정됩니다.weak은 objc를 통해서...storeWeak 함수.
============================================__block
__Block 대상은 Block에서 다시 부여될 수 있습니다.weak 안 돼요.https://blog.csdn.net/u014795020/article/details/51088279
블록 내부에서 외부 부분 변수의 값을 읽을 수 있습니다.그러나 우리가 이 변수의 값을 바꾸어야 할 때, 우리는 그것에 을 추가해야 한다Block 수식자.
__block은 ARC든 MRC 모드든 사용할 수 있고 대상을 수식할 수 있으며 기본 데이터 형식도 수식할 수 있다.