ARC 메모리 변환

1789 단어 arcMRC
iOS 세계에는 주로 두 가지 대상이 있는데 그것이 바로 Objective-C 대상Core Foundation 대상이다.
Core Foundation 대상은 주로 C 언어로 이루어진 Core Foundation Framework의 대상이고 그 중에서 대상 인용 계수의 개념도 있다. 단지 Cocoa Framework의retain/release가 아니라 자신의 CFRetain/CFRelease 인터페이스일 뿐이다.
ARC autoreleasepool 은 어떻게 작동합니까?OC에 GC(스팸 수거기)가 있습니까?
GC 쓰레기 수거기, JAVA C#에서 JAVA와 C#를 배운 사람들은 모두 알고 있다. 더미 속의 메모리는 가상 기기의 독립된 라인이 수거를 책임지는 것을 쓰레기 수거기라고 한다!
oc에서 ARC autoreleasepool은 GC처럼 Person*p = [[[[Person alloc] init] autorelease];자동 방출 탱크는 1>자동 방출 탱크의 공간이 소모됩니다 2>자동 방출 탱크가 방출될 때 autorelease로 표시된 모든 대상을 회수하여release 메시지를 보냅니다
다음은 MRC 코드 MRC 코드 id obj = [[NSObject alloc] init]입니다.void *p = obj; obj = p; [obj release];
Alloc는 하나의 대상을 인용하는데, 인용 계수는 1이고, 실제로는 체인 테이블에서 관리되는Retain일 때, 계수를 +1으로 하고, 계수release가 메모리를 철저히 방출해야 하는지 여부를 계산한다
ARC 코드 id obj = [[NSObject alloc] init];void p = (__bridge void )(obj); obj = (bridge id)(p); bridge 키워드를 사용하면 id 형식과void* 형식의 상호 변환을 실현할 수 있습니다
__bridge_retain 키워드는 유형이 변환될 때 객체의 소유권도 변환된 후 변수가 보유한 MRC 코드가 다음과 같다는 것을 나타냅니다. id obj = [[NSObject alloc] init].void *p = obj; [(id)p retain];
__bridge_retain 테스트 프로그램void*p = 0;{
Person *obj = [[Person alloc] init];
obj.name = @"liufan";
p = (__bridge void *)obj;

} Person tmp = (__bridge Person )p; NSLog(@“class=%@ %p %@“, [(__bridge Person *)p class], p, tmp.name);
bridge_transfer는 원래 대상의 소유권을 가진 변수를 유형 전환 후 원래의 소유권을 방출하려면bridge 를 사용해야 합니다transfer 키워드 MRC 코드는 다음과 같이 값을 부여하기 전에 소유권은 p id obj = (id)p입니다.Obj의 기술에 1 [obj retain]을 추가합니다.P bei [(id)p release];
요약: MRC 및 ARC 변환 bridgeretained는 컴파일러가 대신 retain 조작bridgetransfer는 컴파일러가 우리를 대신해서release 조작을 했다bridge는 단순히 유형 변환을 실행했을 뿐 소유권 이전이 진행되지 않았습니다. 만약에 CFArray Ref로 변환된다면 메모리 동적 메모리 분석 도구를 수동으로 풀어야 합니다. 보조 해결 방법: CMD+Shift+B

좋은 웹페이지 즐겨찾기