43 votes

Pontage correct pour l'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 la nouvelle LLVM ?

Le code original :

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

43voto

Caffeine Points 814

Comme mentionné dans les commentaires, je pense que c'est bien de parler de l'ARC et du contenu de l'UE. Comptage automatique des références ici.

__autoreleasing n'est pas destiné à être utilisé de cette façon. Il est utilisé pour passer des références indirectes d'objets (NSError**, etc). Voir 4.3.4 Passage à un paramètre out par writeback .

Selon 3.2.4 Moulages pontés le __bridge_transfer est correct car le CFURLCreateStringByAddingPercentEscapes renvoie un objet conservé (il y a "create" dans son nom). Vous voulez que ARC prenne possession de l'objet retourné et insère un release (ou autorelease dans ce cas) pour équilibrer cela.

El __bridge pour originalstring est correcte aussi, vous ne voulez pas que ARC fasse quelque chose de spécial à ce sujet.

28voto

Punty Points 481

Il s'agit d'une version correcte, non fuyante. Comme vous le dites dans les commentaires : __bridge_transfer transférer la propriété à NSObject (NSString) et supposer que l'objet est retenu par CF Framework (la méthode CFURLCreateStringByAddingPercentEscapes retourner un retained donc c'est ce dont nous avons besoin) que sur l'objet self, nous ne voulons pas effectuer de gestion de la mémoire. J'espère que cela vous aidera Fra

-(NSString *)urlEncodeUsingEncoding:(NSStringEncoding)encoding {
    return (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
           (__bridge CFStringRef)self,
           NULL,
           (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ",
           CFStringConvertNSStringEncodingToEncoding(encoding));
}

2voto

Shafraz Buhary Points 300
-(NSString *) urlEncoded
{
    CFStringRef encodedCfStringRef = CFURLCreateStringByAddingPercentEscapes(NULL,(CFStringRef)self,NULL,(CFStringRef)@"!*'\"();@+$,%#[]% ",kCFStringEncodingUTF8 );
    NSString *endcodedString = (NSString *)CFBridgingRelease(encodedCfStringRef);
    return endcodedString;
}

0voto

Rob Points 70987

Non __autoreleasing nécessaire. La syntaxe correcte de l'ARC est simplement :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X