precios libro electrónico electronico electronic ebooks ebook definicion books objective-c automatic-ref-counting

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; }