2012-09-17 4 views
0

아래 코드는 NON ARC 코드입니다. ARC 코드로 변환 할 수있는 방법을 알려주고, URL을 인코딩 할 때 메모리 누수가 발생합니다. 이것은 followng 않습니다NSString + EncodeURIComponent

+0

제거 autorelease –

+0

ARC는 'autorelease' 키워드를 허용하지 않습니다. 컴파일러가 말하지 않습니까? 컴파일을 시도하고 컴파일러에서 무엇을 말하는지 확인해야합니다. – Steven

+0

ARC를 켜면 목표 c 포인터 유형 'CFStringRef'의 목표 c 포인터 유형 'NSString'에 대한 브릿지 캐스트가 필요합니다. 그것은 단지 autorelease에 관한 것이 아닙니다. – malhaar

답변

3
return CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, 
              (__bridge CFStringRef)string, 
              NULL, 
              CFSTR("!*'();:@&=+$,/?%#[]"), 
              kCFStringEncodingUTF8)); 

사전에

#import "NSString+EncodeURIComponent.h" 

@implementation NSString (EncodeURIComponent) 

+ (NSString*)stringEncodeURIComponent:(NSString *)string { 
    return [((NSString*)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, 
                   (CFStringRef)string, 
                   NULL, 
                   (CFStringRef)@"!*'();:@&=+$,/?%#[]", 
                   kCFStringEncodingUTF8)) autorelease]; 
} 

@end 

감사합니다 .. :

  • autorelease
  • 은 코어 재단 개체를 전달할 제거는 CFBridgingRelease()를 사용하여 아크. 이 금액은 Create의 균형을 유지합니다. 원칙적으로 (구현은 아님) Core Foundation은 CFRelease()을 수행하고 ARC는 objc_retain()을 수행합니다.
  • 을 사용하는 경우 _bridge 케이스를 추가하십시오. 이것은 ARC와 Core Foundation간에 소유권을 이전하지 않는다는 것을 컴파일러에 알려줍니다. 코어 파운데이션에서 ARC 변수를 사용하기 만하면됩니다.
  • CFSTR()을 사용하여 상수 Core Foundation 문자열을 만듭니다. 이것은 상수 NSString을 생성 한 다음 Core Foundation에 브릿지 캐스팅하는 것보다 더 편리합니다.

Transitioning to ARC Release Notes의 "수신자 부담 브리징 관리"를 참조하십시오.