Управление памятью NSString и NSData

У меня есть следующий код для создания NSString, который будет содержать тело текстового файла, а затем преобразовать его в NSData и вывести его в файл.

NSString *particleString = [[NSString alloc] initWithFormat:@"%@", @"This is the body of my file"];                 
NSData *metaVals = [particleString dataUsingEncoding:NSISOLatin1StringEncoding];

Поскольку я создал частичную строку с помощью alloc, я подумал, что мне нужно выпустить ее после того, как я закончил преобразование в NSData, поэтому я добавил

[particleString release];

Но мое приложение вылетает, когда я добавляю эту строку. Однако, когда я удаляю строку, в которой я использую ее для создания метавалов, я могу спокойно ее выпустить.

Может ли кто-нибудь объяснить, почему передача его в NSData мешает мне его выпустить? Я считаю, что у меня есть ParticleString, что происходит?


person ar106    schedule 28.07.2010    source источник
comment
на какой строке вылетает ваше приложение?   -  person Vladimir    schedule 28.07.2010
comment
Вылетает при достижении релиза. Я забыл добавить, что перед выпуском ParticleString я модифицирую ее, написав: ParticleString = [ParticleString stringByAppendingFormat: @% @, @Some other string]; а затем я отпускаю его. Итак, мой код выглядит так: NSString * ParticleString = [[NSString alloc] initWithFormat: @% @, @This is the body of my file]; ParticleString = [ParticleString stringByAppendingFormat: @% @, @ Некоторая другая строка]; NSData * metaVals = [ParticleString dataUsingEncoding: NSISOLatin1StringEncoding]; [ReleaseString release];   -  person ar106    schedule 28.07.2010
comment
Можете ли вы отредактировать свой вопрос и добавить к нему содержание вашего комментария, потому что ваш комментарий имеет первостепенное значение для возможности ответить на вопрос. NB, оба уже даных ответа верны.   -  person JeremyP    schedule 28.07.2010


Ответы (2)


В соответствии с вашим комментарием вы делаете particleString = [particleString stringByAppendingFormat:@"%@", @"Some other string"];, что теряет ссылку на исходную ParticleString и заменяет ее автоматически выпущенной версией. Затем вы переходите к выпуску автоматически выпущенной версии, вызывая как утечку исходной ParticleString, так и чрезмерную утечку новой.

Попробуй это

NSString *particleString = [NSString stringWithFormat:@"%@", @"This is the body of my file"];
particleString = [particleString stringByAppendingFormat:@"%@", @"Some other string"]; 
NSData *metaVals = [particleString dataUsingEncoding:NSISOLatin1StringEncoding]; 

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

Я бы посоветовал перечитать правила управления памятью

person Joshua Weinberg    schedule 28.07.2010
comment
Большое Вам спасибо. Это было действительно полезно. - person ar106; 28.07.2010

[particleString stringByAppendingFormat:@"%@", @"Some other string"];

это возвращает вновь созданный объект. что означает утечку первого объекта, созданного и назначенного для ParticleString, и вы пытаетесь освободить автоматически выпущенный объект, который был создан с помощью метода -stringByAppendingFormat:

Вы, вероятно, могли бы использовать вместо этого NSMutableString, у которого есть метод с именем appendFormat: (NSString *) ...

person Pier-Olivier Thibault    schedule 28.07.2010
comment
Ответ Джошуа Вайнберга - не менее хороший ответ. Я предлагаю вам использовать то, что вам удобнее всего. - person Pier-Olivier Thibault; 28.07.2010
comment
Отлично. Большое Вам спасибо. - person ar106; 28.07.2010