2013-01-03 3 views
0

FTP를 통해 다운로드 한 NSMutableArray가 있습니다. 배열의 요소는 CFFTPStream resource constants이며 CFStringRef 유형입니다.(목표 C) NSMutableArray에서 CFstringRef 가져 오기

"kCFFTPResourceName"상수로부터 String을 생성하고 싶습니다. 그러나 Objective C와 iphone 개발에 익숙하지 않은 나는 고투하고있다. 내가했던

모두가 같은 크기, 오류가 던지는 ARC 결과는 :

2013-01-03 15:31:44.874 Street Light Reporter[1382:11603] -[__NSCFDictionary objectAtIndex:]: unrecognized selector sent to instance 0x6e1e930 
2013-01-03 15:31:44.875 Street Light Reporter[1382:11603] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary objectAtIndex:]: unrecognized selector sent to instance 0x6e1e930' 

내 가장 최근의 시도입니다 : CFStringRef * C = [objectAtIndex AR : 4];

Incompatible pointer types initializing 'CFStringRef *' (aka 'const struct __CFString **') with an expression of type 'id' 

Implicit conversion of an Objective-C pointer to 'CFStringRef *' (aka 'const struct __CFString **') is disallowed with ARC 

나는 타입 캐스팅의 모든 종류의 시도 (__bridge)와 이것 저것 만지작하고 난 운이 없었을 : 는 다음과 같은 두 가지 이유로 일을 나던.

아무도 나를 도와 줄 수 있습니까? 어떤 도움을 주시면 감사하겠습니다.

+0

힌트 : 원본 JSON 문자열 (적어도 처음 50 자 정도) 또는 JSON 디코더에서 가져온 개체의 NSLog를 표시하십시오. –

답변

3

여기에 두 가지 오류가 있습니다. 첫 번째 오류와 가장 심각한 오류는 ar 개체가 NSArray이 아니라는 것입니다. 그래서 수행하는 것입니다

CFStringRef *c = [ar objectAtIndex:4]; 

당신은 NSInvalidArgumentException을 얻고 있습니다. objectAtIndex:NSdictionary 인스턴스로 보내는 NSArray의 메서드입니다.

두 번째 오류는 캐스트입니다. Fernando가 이미 지적했듯이 다음과 같이 __bridge 키워드를 사용하여 전송해야합니다.

CFStringRef c = (__bridge CFStringRef)([ar objectAtIndex:4]); 

ARC가 현재 해당 개체를 C 포인터로 처리하고 있음을 알 수 있습니다.

참고도 그 CFStringRef

typedef const struct __CFString * CFStringRef; 

로 정의하는 것은 그래서 그것은 이미 포인터 그리고 당신은 * 제거해야합니다.

+2

매우 철저합니다. 그러나 일반 "__bridge"는 소유권을 양도하지 않습니다. 기본 객체는 여전히 ARC에 의해 관리됩니다. 책임을지기 위해서는'__bridge_retained'가 필요합니다. –

+0

@ JoshCaswell 당신은 절대적으로 맞습니다. 나는 __bridge_transfer와 혼동을 느낀다. –

+0

나는 항상 혼란 스럽다. 내가 논평하기 전에 나는 그것을 봐야했다. –

5

CFStringRef는 이미 포인터입니다. 별이 필요하지 않습니다. 또한 CFStringRef를 NSString으로 캐스팅 할 수 있으며 제대로 작동하며 작업하기가 더 쉽습니다. 이것은 수신자 부담 브리징이라고합니다. 여전히 CFStringRef을해야하는 경우

ARC :

CFStringRef c = (__bridge CFStringRef)([ar objectAtIndex:4]); 

비 아크

CFStringRef c = (CFStringRef)([ar objectAtIndex:4]); 
+0

** 불만을 털어 놓은 가난한 비 ARC 솔루션 ** ** –

+0

컴파일이 완료되었지만 해당 라인을 지나치면 앱이 다운됩니다 : '캐치되지 않은 예외로 인해 앱 종료'NSInvalidArgumentException ', 이유 : - [__ NSCFDictionary objectAtIndex :] : 인식 할 수없는 선택기가 인스턴스 0x79cd1e0에 전송되었습니다. – 0nyx

+1

"ar"은 NSArray가 아니며 NSArray가 아니므로, 구문 분석에 문제가 발생하여 게시 한 코드에 없습니다. –

1

당신이 다시 아닌 배열 CFDictionary을받을 것으로 보인다. 링크 된 상수는 값에 액세스 할 수있는 사전의 키입니다.

관련 문제