0
아래 코드는 NON ARC 코드입니다. ARC 코드로 변환 할 수있는 방법을 알려주고, URL을 인코딩 할 때 메모리 누수가 발생합니다. 이것은 followng 않습니다NSString + EncodeURIComponent
아래 코드는 NON ARC 코드입니다. ARC 코드로 변환 할 수있는 방법을 알려주고, URL을 인코딩 할 때 메모리 누수가 발생합니다. 이것은 followng 않습니다NSString + EncodeURIComponent
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의 "수신자 부담 브리징 관리"를 참조하십시오.
제거 autorelease –
ARC는 'autorelease' 키워드를 허용하지 않습니다. 컴파일러가 말하지 않습니까? 컴파일을 시도하고 컴파일러에서 무엇을 말하는지 확인해야합니다. – Steven
ARC를 켜면 목표 c 포인터 유형 'CFStringRef'의 목표 c 포인터 유형 'NSString'에 대한 브릿지 캐스트가 필요합니다. 그것은 단지 autorelease에 관한 것이 아닙니다. – malhaar