Richtige Überbrückung für ARC?
Habe ich eine Kategorie Klasse 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;
}
Bin ich mit der richtigen bridge-transfers für ARC und dem neuen LLVM?
Den original-code:
- (NSString *)URLEncodedString
NSString *encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
(CFStringRef)self,
NULL,
(CFStringRef)@"!*'();:@&=+$,/?%#[]",
kCFStringEncodingUTF8);
return [encodedString autorelease];
}
InformationsquelleAutor der Frage Stephan Keene | 2011-07-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie gesagt in den Kommentaren, ich denke, es ist gut, sprechen Sie über die ARC und die Inhalte der Die Automatische Referenz-Zählung hier.
__autoreleasing
ist nicht gedacht, um verwendet werden, wie, dass. Es ist verwendet für die übergabe von indirekten Objekt-Referenzen (NSError**, etc). Sehen 4.3.4 Weitergabe an einen out-parameter durch Rückschreiben.Laut 3.2.4 Überbrückt wirftdie
__bridge_transfer
korrekt ist, da dieCFURLCreateStringByAddingPercentEscapes
Funktion gibt ein Objekt beibehalten (es hat "erstellen" in seinem Namen). Sie möchten ARC in Besitz zu nehmen und das zurückgegebene Objekt und legen Sie eine Freigabe (oder autorelease in diesem Fall), um dies auszugleichen.Den
__bridge
cast füroriginalstring
richtig ist auch, wollen Sie nicht ARC zu tun, nichts besonderes.InformationsquelleAutor der Antwort Caffeine
Dies ist eine richtige, nicht undicht version.
Wie Sie sagen, in den Kommentaren:
__bridge_transfer
transfer das Eigentum anNSObject
(NSString)
und davon ausgehen, dass das Objekt bleibtCF Framework
(die MethodeCFURLCreateStringByAddingPercentEscapes
Gegenzug eineretained
Objekt, also das ist, was wir brauchen)als auf die selbst-Objekt wollen wir nicht ausführen, Speicher-management. Hoffe es hilft
Fra
InformationsquelleAutor der Antwort Punty
InformationsquelleAutor der Antwort Shafraz Buhary
Kein
__autoreleasing
notwendig. Die richtigen ARC-syntax ist einfach:InformationsquelleAutor der Antwort Rob