Управление памятью Objective-C относительно кода, не использующего `release` - PullRequest
1 голос
/ 06 декабря 2010

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

  htmlEscapes = [[NSDictionary alloc] initWithObjectsAndKeys:
//        @"&", @"&",
        @"&lt;", @"<",
        @"&gt;", @">",
        @"&#039;", @"'",
        @"&quot;", @"\"",        
        nil
        ];

весь класс

#import "NSString+HTML.h"


@implementation NSString (HTMLExtensions)

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

+ (NSDictionary *)htmlEscapes {
 if (!htmlEscapes) {
  htmlEscapes = [[NSDictionary alloc] initWithObjectsAndKeys:
//        @"&amp;", @"&",
        @"&lt;", @"<",
        @"&gt;", @">",
        @"&#039;", @"'",
        @"&quot;", @"\"",        
        nil
        ];
 }
 return htmlEscapes;
}

+ (NSDictionary *)htmlUnescapes {
 if (!htmlUnescapes) {
  htmlUnescapes = [[NSDictionary alloc] initWithObjectsAndKeys:
//       @"&", @"&amp;",
       @"<", @"&lt;", 
       @">", @"&gt;",
       @"'", @"&#039;",
       @"\"", @"&quot;",
       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

Ответы [ 2 ]

3 голосов
/ 06 декабря 2010

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

3 голосов
/ 06 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...