web-dev-qa-db-fra.com

Pontage correct pour ARC?

J'ai une classe de catégorie pour 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;
}

Est-ce que j'utilise les bons transferts de pont pour ARC et le nouveau LLVM?

Le code d'origine:

- (NSString *)URLEncodedString
    NSString *encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
                                (CFStringRef)self,
                                NULL,
                                (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                                kCFStringEncodingUTF8);
    return [encodedString autorelease];
}
43
Stephan Keene

Comme mentionné dans les commentaires, je pense que nous pouvons parler d'ARC et du contenu de Comptage automatique de références ici.

__autoreleasing n'est pas destiné à être utilisé comme ça. Il est utilisé pour passer des références d'objet indirectes (NSError **, etc.). Voir 4.3.4 Passage d'un paramètre out en écriture .

Conformément à 3.2.4 Incidences pontées , le __bridge_transfer est correct car la fonction CFURLCreateStringByAddingPercentEscapes renvoie un objet conservé (il porte le nom "create"). Vous souhaitez qu'ARC prenne possession de l'objet renvoyé et insère une version (ou une version automatique dans ce cas) pour compenser cela.

Le transtypage __bridge pour originalstring est également correct, vous ne voulez pas que ARC fasse quelque chose de spécial à ce sujet.

43
Caffeine

Ceci est une version correcte, qui ne fuit pas ... Comme vous le dites dans les commentaires: __bridge_transfer transférez la propriété à NSObject(NSString) et supposez que l’objet est conservé par CF Framework (la méthode CFURLCreateStringByAddingPercentEscapes renvoie un objet retained, c’est ce dont nous avons besoin) que sur l’objet auto, nous ne voulons effectuer aucune gestion de mémoire. J'espère que ça aide Fra

-(NSString *)urlEncodeUsingEncoding:(NSStringEncoding)encoding {
    return (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
           (__bridge CFStringRef)self,
           NULL,
           (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ",
           CFStringConvertNSStringEncodingToEncoding(encoding));
}
28
Punty
-(NSString *) urlEncoded
{
    CFStringRef encodedCfStringRef = CFURLCreateStringByAddingPercentEscapes(NULL,(CFStringRef)self,NULL,(CFStringRef)@"!*'\"();@+$,%#[]% ",kCFStringEncodingUTF8 );
    NSString *endcodedString = (NSString *)CFBridgingRelease(encodedCfStringRef);
    return endcodedString;
}
2
Shafraz Buhary

Pas de __autoreleasing nécessaire. La syntaxe ARC correcte est simplement:

- (NSString *)URLEncodedString
{
    return CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(NULL,
                                                                     (CFStringRef)self,
                                                                     NULL,
                                                                     (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                                                                     kCFStringEncodingUTF8));
}
0
Rob