NSStringのカテゴリクラスがあります。
@implementation NSString (URLEncode)
- (NSString *)URLEncodedString
{
__autoreleasing NSString *encodedString;
NSString *originalString = (NSString *)self;
encodedString = (__bridge_transfer NSString * )
CFURLCreateStringByAddingPercentEscapes(NULL,
(__bridge CFStringRef)originalString,
NULL,
(CFStringRef)@"!*'();:@&=+$,/?%#[]",
kCFStringEncodingUTF8);
return encodedString;
}
ARCと新しいLLVMに正しいブリッジ転送を使用していますか?
元のコード:
- (NSString *)URLEncodedString
NSString *encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
(CFStringRef)self,
NULL,
(CFStringRef)@"!*'();:@&=+$,/?%#[]",
kCFStringEncodingUTF8);
return [encodedString autorelease];
}
コメントで述べたように、ARCと Automatic Reference Counting の内容についてここで話しても問題ないと思います。
__autoreleasing
はそのように使用することを意図していません。間接オブジェクト参照(NSError **など)を渡すために使用されます。 4.3.4ライトバックによる出力パラメーターへの引き渡し を参照してください。
.2.4ブリッジキャスト によると、__bridge_transfer
は正しいです。CFURLCreateStringByAddingPercentEscapes
関数は保持されたオブジェクトを返します(名前に「create」が含まれています)。 ARCが返されたオブジェクトの所有権を取得し、リリース(この場合は自動リリース)を挿入して、これを調整します。
__bridge
originalstring
のキャストも正しいので、ARCに特別なことをさせたくありません。
これは正しいバージョンで、リークはありません。コメントで言うとおり:__bridge_transfer
所有権をNSObject
(NSString)
に譲渡し、オブジェクトがCF Framework
によって保持されていると想定します(メソッドCFURLCreateStringByAddingPercentEscapes
return retained
オブジェクトなので、これが必要です)、メモリ管理を実行したくないselfオブジェクトよりも。それがフラを助けることを願っています
-(NSString *)urlEncodeUsingEncoding:(NSStringEncoding)encoding {
return (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
(__bridge CFStringRef)self,
NULL,
(CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ",
CFStringConvertNSStringEncodingToEncoding(encoding));
}
-(NSString *) urlEncoded
{
CFStringRef encodedCfStringRef = CFURLCreateStringByAddingPercentEscapes(NULL,(CFStringRef)self,NULL,(CFStringRef)@"!*'\"();@+$,%#[]% ",kCFStringEncodingUTF8 );
NSString *endcodedString = (NSString *)CFBridgingRelease(encodedCfStringRef);
return endcodedString;
}
番号 __autoreleasing
必要です。正しいARC構文は次のとおりです。
- (NSString *)URLEncodedString
{
return CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(NULL,
(CFStringRef)self,
NULL,
(CFStringRef)@"!*'();:@&=+$,/?%#[]",
kCFStringEncodingUTF8));
}