17

최근에 ARC (Automatic Reference Counting)를 사용하여 새 프로젝트를 시작했습니다.
내가있는 CALayer의 내용을 할당 할 때 :ARC는 Core Graphics 객체에서 작동합니까?

UIView* view = ... 
UIImage* image = ... 
view.layer.contents = image.CGImage 
나는 오류가 아닌 목표 - C 포인터 형 'ID'에서 'CGImageRef'의

암시 적 변환을 가지고

를 ARC으로 허용되지 않습니다

단순히 CGImageRefid에 오류를 숨 깁니다 캐스팅,하지만 난 여전히 ARC이 기능이 올바르게 다음 있을까요?

답변

42

정말 WWDC 2011의 ARC 비디오를 확인해야합니다. 개발자 사이트에서 볼 수 있으며 iTunes를 통해 열 수 있습니다. 특히 :

세션 323 •

-

또한 깊이에 목표 - C 전진 호 참조 노트 - 자동 참조가 세션 (322) •

계산 소개 :

https://developer.apple.com/library/content/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html

참고서와 비디오 모두 Core Graphics (et al)와 그들이 ARC와 어떻게 작동하는지에 대해 설명합니다.

특히, 당신은 코어 재단 스타일의 객체를 사용할 필요가 많은 Cocoa 응용 프로그램에서 "관리 수신자 부담 브리징"

라는 섹션을 확인합니다 (예 : 코어 파운데이션 프레임 워크 자체에서 여부 CFArrayRef 또는 CFMutableDictionaryRef) 또는 코어 그래픽 (CGColorSpaceRef 및 CGGradientRef와 같은 유형 을 사용할 수 있음)과 같은 Core Foundation 규칙을 채택하는 프레임 워크에서 가져올 수 있습니다.

컴파일러는 Core Foundation 개체의 수명을 자동으로 관리하지 않습니다. Core Foundation 메모리 관리 규칙 (메모리 관리 프로그래밍 핵심 기초 가이드 참조)에 명시된대로 CFRetain 및 CFRelease (또는 해당 유형별 변형)를 호출해야합니다.

당신이 목표 - C와 코어 재단 스타일의 객체 사이에 캐스팅 경우 필요 캐스트를 사용하여 객체 의 소유권의 의미에 대한 컴파일러를 알려줄 수 (objc/runtime.h에 정의) 또는 코어 (NSObject.h에 정의) 재단 스타일 매크로 : [...]

르그 야콥 센뿐만 아니라 브리지 옵션의 좋은 요약 개요이 있습니다 Managing Toll-free Bridging in an ARC’ed Environment.

__bridge_retained (n.b.: 객체 포인터에서 C 유형 포인터로 캐스팅 할 때만 사용하십시오.) (프로그래머)는 ARC로 불투명 한 C 유형 포인터의 어두운 영역에서이 객체를 참조해야합니다. 그럼 제발, 제발 아직 이 필요한 동안이 객체를 공개하지 마십시오. I (프로그래머는) 내가이

__bridge_transfer 함께 할있을 때 (어두운 세계에서) 그것을 자신을 해제 약속 (NB : 포인터를 객체에 C 형 포인터로 캐스팅하는 경우에만 사용) : I (프로그래머)는 ARC, 내가 소유 한 객체를 넘겨주고 더 이상 어둠에 관심이 없다는 것을 알려줍니다. 당신에게 불투명 한 C 타입 포인터의 세계. ARC가 일 때마다 해당 객체로 작업을 완료하십시오. 알기 때문에 직접 풀어 놓으십시오. 따라서 직접 수행하지 않아도되는 작업을 저축하십시오.

__bridge : ARC, 당신은 ... 나는 는 C 형 포인터의 어두운 세계에서 광산을 균형 유지로가 유지 해제 밖으로 균형을 유지. 어두운 세계에서 물건을 붙잡을 필요가있을 때마다 자신을 유지하고 적절할 때 놓습니다. ARC와 (과) 계약이 필요하지 않습니다.

+0

매우 도움이되고 완전한 대답, 많이 감사합니다 – Pieter

+0

:) 감사합니다! 다행스럽게 도울 수있어! 우리는 며칠 전에 우리가 꽤 큰 응용 프로그램을 마이 그 레이션 및 모든 꼬임을 작동하는 데 약 이틀이 걸렸지 만, 나는 최종 결과에 매우 만족합니다. 코드가 훨씬 적고 훨씬 강력합니다. ARC는 매우 좋습니다. 저 영상은 저를위한 굉장한 자원이었다. – Steve

+0

+1은 Jorg Jacobsen의 설명을 인용 한 것입니다. – jAckOdE

8

스티브가 지적한 참고 자료에도 불구하고 위에 표시된 사례가 특별하다고 생각합니다. Transitioning to ARC Release Notes에서 절 "컴파일러는 CF 코코아 방법에서 반환 된 개체 처리"에 주목 :

컴파일러는 코어 재단 유형이 역사적 코코아 이름 지정 규칙을 따라야 반환 오브젝티브 C 방법을 이해합니다 ( 고급 메모리 관리 프로그래밍 안내서). 예를 들어 컴파일러는 iOS에서 UIColor의 CGColor 메서드에 의해 반환 된 CGColor가 소유되지 않는다는 것을 알고 있습니다.

이 코드 예제는 그들이 제공 :

gradientLayer.colors = [NSArray arrayWithObjects:(id)[[UIColor darkGrayColor] CGColor], 
               (id)[[UIColor lightGrayColor] CGColor], nil]; 

이러한 방법에서 CGColors의 알려진 수익률 (그들이해야 내가 위의 코드에 추가 한 아이디로 캐스팅 누락에 의존 조만간 설명서에서 수정 됨).

[image CGImage]이 명명 규칙을 따르므로 여기서는 CGImage가 제대로 연결될 것이라고 믿습니다. 나는 네가 이드에게 던져주는 것이 여기 필요한 모든 것이어야한다고 생각한다.

4

layer.contents = (id)image.CGImage에 대한 한 가지 일반적인 대답은 layer.contents = obj_unretainedObject(image.CGImage)입니다.

나는 =(__bridge id)image.CGImage입니다.

+0

가독성을 높이기 위해 답안에 코드 서식을 추가하는 것이 좋습니다. –

관련 문제