2010-12-06 2 views
1

Я нашел код, который используется для удаления html-символов. У меня есть вопрос об этом коде. так как вы можете увидеть это «alloc» и не «освободить» его. это вызывает утечку памяти? должен ли он быть выпущен?Объектив c Управление памятью

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

спасибо ...

весь класс


 

#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 

ответ

3

По-видимому, только один экземпляр NSDictionary создан и он целенаправленно хранить и использовать повторно в течение времени жизни приложения. Это не считается утечкой памяти (по крайней мере, не в одной среде с резьбой, конечно, потенциальное состояние гонки возможно для оператора if).

3

Это распространенный шаблон для реализации синглета в Objective-C. Один экземпляр htmlEscapes выделяется благодаря проверке, является ли nil и никогда не освобождается. Это технически утечка, но ее можно игнорировать безопасно.

Смежные вопросы