2010-12-06 6 views
1

J'ai trouvé un code qui est utilisé pour échapper les caractères html. J'ai une question à propos de ce code. comme vous pouvez le voir "alloc" et ne "libère" pas. cela provoque-t-il des fuites de mémoire? doit-il être libéré?objectif c gestion de la mémoire

 
    htmlEscapes = [[NSDictionary alloc] initWithObjectsAndKeys: 
//  @"&", @"&", 
     @"<", @"", 
     @"'", @"'", 
     @""", @"\"",   
     nil 
     ]; 

grâce ...

classe entière


 

#import "NSString+HTML.h" 


@implementation NSString (HTMLExtensions) 

static NSDictionary *htmlEscapes = nil; 
static NSDictionary *htmlUnescapes = nil; 

+ (NSDictionary *)htmlEscapes { 
if (!htmlEscapes) { 
    htmlEscapes = [[NSDictionary alloc] initWithObjectsAndKeys: 
//  @"&", @"&", 
     @"<", @"", 
     @"'", @"'", 
     @""", @"\"",   
     nil 
     ]; 
} 
return htmlEscapes; 
} 

+ (NSDictionary *)htmlUnescapes { 
if (!htmlUnescapes) { 
    htmlUnescapes = [[NSDictionary alloc] initWithObjectsAndKeys: 
//  @"&", @"&", 
     @"", @">", 
     @"'", @"'", 
     @"\"", @""", 
     nil 
     ]; 
} 
return htmlEscapes; 
} 

static NSString *replaceAll(NSString *s, NSDictionary *replacements) { 
for (NSString *key in replacements) { 
    NSString *replacement = [replacements objectForKey:key]; 
    s = [s stringByReplacingOccurrencesOfString:key withString:replacement]; 
} 
return s; 
} 

- (NSString *)htmlEscapedString { 
return replaceAll(self, [[self class] htmlEscapes]); 
} 

- (NSString *)htmlUnescapedString { 
return replaceAll(self, [[self class] htmlUnescapes]); 
} 

@end 

Répondre

3

Apparemment, une seule instance de NSDictionary est créé et il est volontairement stockée et réutilisée pour la durée de vie de l'application. Ce n'est pas considéré comme une fuite de mémoire (du moins pas dans un environnement à un seul thread, bien sûr, une condition de concurrence potentielle est possible pour l'instruction if).

3

C'est un modèle commun pour l'implémentation d'un singleton en Objective-C. Une instance de htmlEscapes est allouée grâce à la vérification pour voir si elle est nulle et n'a jamais été désallouée. C'est techniquement une fuite, mais il peut être ignoré en toute sécurité.