Ste*_*ene 43 objective-c automatic-ref-counting
我有一个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;
}
Run Code Online (Sandbox Code Playgroud)
我是否使用ARC和新LLVM的正确桥接传输?
原始代码:
- (NSString *)URLEncodedString
NSString *encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
(CFStringRef)self,
NULL,
(CFStringRef)@"!*'();:@&=+$,/?%#[]",
kCFStringEncodingUTF8);
return [encodedString autorelease];
}
Run Code Online (Sandbox Code Playgroud)
Caf*_*ine 43
正如评论中所提到的,我认为在这里讨论ARC和自动引用计数的内容是很好的.
__autoreleasing
并不意味着像这样使用.它用于传递间接对象引用(NSError**等).请参见4.3.4通过回写传递给out参数.
根据3.2.4 Bridged强制转换,__bridge_transfer
当CFURLCreateStringByAddingPercentEscapes
函数返回一个保留对象(它的名称中有"create")时,它是正确的.您希望ARC获取返回对象的所有权并插入一个版本(在本例中为自动释放)以平衡此问题.
该__bridge
流延originalstring
是正确的也一样,你不想ARC做什么特别的地方.
Pun*_*nty 28
这是一个正确的,而不是泄漏的版本.正如您在评论中所说:__bridge_transfer
将所有权转移到NSObject
(NSString)
并假设该对象被保留CF Framework
(该方法CFURLCreateStringByAddingPercentEscapes
返回一个retained
对象,这就是我们需要的),而不是我们不想执行任何内存管理的自我对象.希望它有助于Fra
-(NSString *)urlEncodeUsingEncoding:(NSStringEncoding)encoding {
return (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
(__bridge CFStringRef)self,
NULL,
(CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ",
CFStringConvertNSStringEncodingToEncoding(encoding));
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
22306 次 |
最近记录: |