2012-09-05 6 views
9

가능한 중복 :
How to make an CFArrayRef to an NSMutableArrayCFArrayRef를 NSArray로 변환하는 방법?

나는이 질문에 대한 많은 정보가 알고 있지만 하나 하나 답변이 쉽다 "당신은 무료 브리지로 캐스팅 할 수 있습니다. . "다음 실제 소스 코드에 대한 언급은 없습니다. 무료 및 브리지 연결의 평균을 알고 있습니다. 정확한 소스 코드를 알고 싶습니다. "어떻게 CFArrayRef를 NSArray로 변환합니까?" . 누구나 제발 !!!!!!

답변

5

당신이 캐스팅 할 수 있어야한다 : 규칙을 약간 수정 한 때문에

CFArrayRef *myLegacyArray = ... 

... 

NSArray *myArray=[(NSArray *)myLegacyArray copy]; 
+0

대단히 감사합니다! 나는 지금 당장 노력할 것이다! – user1574429

+1

복사 할 필요가 없습니다. 무료 문자 브릿지는 문자 그대로 NSArray * myNsArray = (NSArray *) myCfArray; – jjv360

+0

입니다. 이는 ARC가 아닌 코드에서만 작동합니다. –

37

음, 먼저, 당신은 ARC 여부를 사용하는 경우 알아야합니다. 다음으로, 캐스팅을 통해 실제로 무엇을하고 싶은지를 알아야합니다. 가치를 사용하거나 소유권을 이전하기를 원하십니까?

IMO는 모든 새 코드가 실제로 ARC를 사용해야하므로 (ARC는 캐스팅 문제가 더 많이 발생하기 때문) ARC로 가정합니다.

CFArrayRef someArrayRef = ...; 
NSArray *array = (__bridge NSArray*)someArrayRef; 

상기 코드는 현재 컨텍스트에 사용될 수있는 NSArray*에 CF 참조 캐스트. 소유권 이전은 발생하지 않았습니다. someArrayRef은 여전히 ​​해당 참조를 보유하고 있으며 수동으로 someArrayRef을 수동으로 릴리스해야합니다. 그렇지 않으면 누출됩니다.

CFArrayRef someArrayRef = ...; 
NSArray *array = CFBridgingRelease(someArrayRef); 

이 코드에서는 캐스트를 얻지 않고 소유권을 이전합니다. someArrayRef은 더 이상 참조를 보유하지 않으므로 수동으로 해제 할 필요가 없습니다. 대신 array이 해제되면 객체는 dealloc됩니다 (다른 위치에서는 다른 참조가 없다고 가정 함).

+0

CFBridgingRelease는 ARC 환경에 들어가는 방법입니다. 항상 NS로 전송 ... CFBridgingRelease 사용 –

관련 문제