objective c - libro - Corregir los puentes para ARC?
libro electronico (4)
Como mencioné en los comentarios, creo que está bien hablar sobre ARC y los contenidos del conteo automático de referencias aquí.
__autoreleasing
no está destinado a ser usado así. Se usa para pasar referencias indirectas a objetos (NSError **, etc.). Ver 4.3.4 Pasar a un parámetro de salida por reescritura .
De acuerdo con 3.2.4 __bridge_transfer
puente , __bridge_transfer
es correcto ya que la función CFURLCreateStringByAddingPercentEscapes
devuelve un objeto retenido (tiene "create" en su nombre). Desea que ARC tome posesión del objeto devuelto e inserte una versión (o liberación automática en este caso) para equilibrar esto.
El __bridge
para la __bridge
originalstring
es correcto, no quieres que ARC haga algo especial al respecto.
Tengo una clase de categoría para 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;
}
¿Estoy utilizando las transferencias de puente correctas para ARC y el nuevo LLVM?
El código original:
- (NSString *)URLEncodedString
NSString *encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
(CFStringRef)self,
NULL,
(CFStringRef)@"!*''();:@&=+$,/?%#[]",
kCFStringEncodingUTF8);
return [encodedString autorelease];
}
Esta es una versión correcta, sin fugas. Como dices en los comentarios: __bridge_transfer
transfiere la propiedad a NSObject
(NSString)
y asumes que el objeto es retenido por CF Framework
(el método CFURLCreateStringByAddingPercentEscapes
devuelve un objeto retained
así que esto es lo que necesitamos) que en el objeto self que no hacemos Desea realizar cualquier gestión de memoria. Espero que ayude Fra
-(NSString *)urlEncodeUsingEncoding:(NSStringEncoding)encoding {
return (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
(__bridge CFStringRef)self,
NULL,
(CFStringRef)@"!*''/"();:@&=+$,/?%#[]% ",
CFStringConvertNSStringEncodingToEncoding(encoding));
}
No __autoreleasing
necesario. La sintaxis ARC correcta es simplemente:
- (NSString *)URLEncodedString
{
return CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(NULL,
(CFStringRef)self,
NULL,
(CFStringRef)@"!*''();:@&=+$,/?%#[]",
kCFStringEncodingUTF8));
}
-(NSString *) urlEncoded
{
CFStringRef encodedCfStringRef = CFURLCreateStringByAddingPercentEscapes(NULL,(CFStringRef)self,NULL,(CFStringRef)@"!*''/"();@+$,%#[]% ",kCFStringEncodingUTF8 );
NSString *endcodedString = (NSString *)CFBridgingRelease(encodedCfStringRef);
return endcodedString;
}