Давайте пройдемся по вашему коду построчно.
- (NSArray*)test {
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://stackoverflow.com/"]];
Это создает объект данных. Вы не владеете им, но он останется на все остальное время метода. Пока все хорошо.
NSString *result = [[NSString alloc] initWithBytes:[data bytes]
length:[data length]
encoding:NSMacOSRomanStringEncoding];
Это создает строковый объект, которым вы владеете. Опять же, здесь нет проблем - нам просто нужно выпустить его позже.
result = [result stringByAppendingString:@"something"];
Вы отбрасываете свою ссылку на строковый объект, который был в result
, и сохраняете новый строковый объект, который вам не принадлежит. Это утечка, потому что вы больше не можете освободить исходную строку. Кроме того, вы правильно заметили, что новая строка может рассматриваться как объект с автоматическим освобождением, что означает, что вы не должны освобождать ее.
NSArray *arr = [NSArray arrayWithObject:result];
Вопреки вашему убеждению, это ничего не копирует. Он просто сохраняет ссылку на новую строку и сохраняет ее.
//[result release];
Вы не должны выпускать result
на этом этапе, потому что объект, который он содержит, не принадлежит вам - вы получили его от stringByAppendingString:
, а не от метода с new
, alloc
, retain
или copy
в его названии. Освобождение этого объекта, которым вы не владеете, почти наверняка приведет к падению в какой-то момент. Старый объект, которым вы владеете и должен выпустить , был потерян двумя строками ранее, и освобождение чего-то другого на его месте не поможет.