Почему инструменты думают, что это утечка памяти? - PullRequest
2 голосов
/ 03 августа 2009

У меня есть вид About, который я нажимаю на NavigationController. Представление имеет одну UILabel, которая связана с IBOutlet. В viewDidLoad я заполняю UILabel номером версии пакета (строка). Тестирование на инструментах показало, что строка, помеченная комментарием, вызывает утечку памяти: -

viewDidLoad {
    [super viewDidLoad];

    self.title = @"About";
    // Line below is the suggested culprit ***
    NSString *versionLabel = [[NSString alloc] initWithFormat:@"Version %@", 
                              [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString *)kCFBundleVersionKey]];

    self.applicationVersion.text = versionLabel;
    [versionLabel release];
    versionLabel = nil;
}

Я предполагаю, что он предлагает строку NSSt, а не что-нибудь еще в строке ...

Мои вопросы Почему?

Ответы [ 3 ]

2 голосов
/ 03 августа 2009

Я подозреваю, что вы пропускаете applicationVersion UILabel. Это приведет к утечке строки в качестве побочного продукта. Наиболее распространенной причиной этого на iPhone является несоблюдение правил управления памятью NIB .

0 голосов
/ 04 августа 2009

Это может быть утечка из mainBundle или infoDictionary - возможно, система кэширует одну или другую из них, и поэтому они создаются, а затем никогда не освобождаются.

Попробуйте добавить в ваше приложение DidFinish, запустив код:

[[NSBundle mainBundle] infoDictionary];

Без какого-либо другого кода и посмотрите, указывает ли Leaks на эту линию в качестве местоположения утечки. В этом случае кеширование является проблемой, и вы можете ее игнорировать.

0 голосов
/ 03 августа 2009

В этом случае вам даже не нужно создавать экземпляр NSString, просто используйте следующий метод, который действует на класс NSString (не экземпляр):

NSString *versionLabel = [NSString stringWithFormat:@"Version %@", 
                                             [[[NSBundle mainBundle] infoDictionary] 
                                            objectForKey:(NSString*)kCFBundleVersionKey]];

Если вы используете NSString таким образом, вам не нужно выпускать versionLabel, потому что память никогда не выделялась.

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