저수준 API에서 CFDictionary 나 CFArray를 얻고 자동 참조로 계산 된 Objective-C 영역에 항목 중 하나만 유지하려고한다고 가정 해보십시오. 다음과 같음 :CFRelease'd 컬렉션에있는 항목에 대한 참조를 어떻게 연결해야합니까?
NSString* value = nil;
CFDictionaryRef info = FrameworkCopySomeInfo();
value = (id)CFDictionaryGetValue(info, kFrameworkSomeKey);
CFRelease(info);
// BUG: presumably value is an invalid reference now!
이처럼 가장 좋은 패턴은 무엇입니까? CFRelease
을 호출하는 대신 __bridge_transfer
정보 사전을 사용해 보시기 바랍니다. 하지만 bridged casts documentation은 다음과 같이 말합니다 (강조 표시).
ARC는 값 [ 내 정보 사전]은 인 로컬 값에 대한 일반적인 최적화가 적용되는 의 전체 표현식 끝 부분에 있습니다.
나는
NSString* value = nil;
NSDictionary* info = (__bridged_transfer id)FrameworkCopySomeInfo();
value = [info objectForKey:(__bridge id)kFrameworkSomeKey];
// …no further reference to `info`, but `value` continues to be used
은 ... 아마도 컴파일러 내가 value
포인터를 얻을 직후 info
사전을 해제 할 수 ... 내 코드처럼 보이는 경우 걱정입니다. 가장 깨끗한 것은 무엇입니까 (가장 적은 캐스트, 혼란스럽지 만) 여기에도 여전히 정확한 패턴이 있습니까?
그러나 'value'에 대한 참조를 얻은 후에 바로 컴파일러가'info'를 릴리스 할 수 없습니까? 이것은 여전히 그 값이 retain + autorelease를 얻는다 고 가정하는 것으로 보이는데, 이것은 [Get The Rule]과 모순이됩니다 (https://developer.apple.com/library/mac/documentation/corefoundation/Conceptual/CFMemoryMgmt/Concepts/Ownership). .html # // apple_ref/doc/uid/20001148-SW1) -'value'는'info'를 더 이상 사용하지 않으면 소유자가 없습니다. – natevw
자동 참조 횟수는 자동으로 '값'을 유지합니다. – MaddTheSane
@MaddTheSane 알았어, 좋을거야. 문서화 된 부분을 공유 할 수 있습니까? – natevw