2010-12-06 4 views
1

html 문자를 이스케이프하는 데 사용되는 코드를 발견했습니다. 이 코드에 대한 질문이 있습니다. 당신이 볼 수 있듯이 "할당"하고 그것을 "공개"하지 않습니다. 메모리 누수가 발생합니까? 반드시 공개해야합니까?objective 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의 한 인스턴스는 if가 nil인지 never 할당되지 않았는지 확인하는 검사 덕분에 할당됩니다. 이것은 기술적으로 누설이지만 안전하게 무시할 수 있습니다.