Управление памятью iPhone со свойствами синглетонов - PullRequest
1 голос
/ 14 февраля 2010

Кажется, у меня есть фундаментальный пробел в моем понимании управления памятью. Приведенный ниже код находится в единственном экземпляре, который несколько раз вызывается в моем приложении для анализа данных, загружаемых из Интернета. Для каждой загружаемой статьи я выделяю изменяемую строку, затем выполняю тонны разбора, а затем записываю файл в файловую систему для последующего отображения в UIWebView.

Но каждый раз, когда я вхожу в этот метод, я выделяю новую "articleString". И я никогда не выпускаю эту строку. Я думаю, что это утечка, но если я добавлю выпуск в нижней части этого метода (после того, как файл будет записан), мое приложение будет аварийно завершено при следующем вызове этого метода. Я не понимаю, почему это происходит сбой, так как в следующий раз будет вызван другой NSMutableString.

ОБНОВЛЕНИЕ: я освобождаю articleString в методе dealloc. Но все же кажется, что я должен выпустить в конце этого метода, так как я размещаю каждый раз, когда я вхожу.

ОБНОВЛЕНИЕ: articleString определяется в заголовке следующим образом:

@property (nonatomic, retain) NSMutableString *articleString;

метод parseArticle ниже является заполнителем для ряда методов, которые манипулируют articleString.

 self.articleString = [[NSMutableString alloc] initWithData:articleData encoding:NSUTF8StringEncoding];

 //Parse the article for display
 [self parseArticle];

 //Write the article string to a file for later display
 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
 NSString *documentsDirectory = [paths objectAtIndex:0];
 NSString *path = [documentsDirectory stringByAppendingPathComponent:@"article.html"];
 NSLog(@"%@", articleString);
 [articleString writeToFile:path atomically:YES];

1 Ответ

1 голос
/ 14 февраля 2010

Мне нравится, когда свойства обрабатывают это для меня. Если для свойства articleString установлено значение retain, это просто.

self.articleString = [[[NSMutableString alloc] initWithData:articleData encoding:NSUTF8StringEncoding] autorelease];

[self doStuff];

Тогда

- (void)dealloc {
    self.articleString = nil;
    [super dealloc]
}

строка статьи будет выпущена и правильно сохранится при установке новой. И он будет очищен на dealloc.

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