2010-04-18 4 views
1

В приведенном ниже коде я создаю новый NSString с alloc и инициализируя его содержимым некоторого файла. Поскольку я называю alloc, я знаю, что моя обязанность вызывать выпуск в строке, когда я закончил. Но как насчет переменных «линии» и «линия»? Поскольку метод «componentsSeparatedByString» не начинается со слова «новый» или «создать», могу ли я предположить, что «линии» будут автореализованы? Тот же вопрос для «строки», поскольку «objectAtIndex» также не начинается с «нового» или «создания».Должен ли я назвать освобождение от этих переменных-переменных какао?

 
    NSString* buffer = [[NSString alloc] initWithData:[fileManager contentsAtPath:@"/foo"] 
           encoding:NSUTF8StringEncoding]; 

    NSArray* lines = [buffer componentsSeparatedByString:@"\n"]; 
    NSString* line = [lines objectAtIndex:5]; 

    // do something with line 

    [buffer release]; 

Значит, код выше хорошо? Или я должен называть «выпуск» на линиях и линии тоже? Благодарю.

+0

Жизненное чтение: http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/MemoryMgmt/ –

ответ

3

Да линии и линии будут автореализоваться. Помните: у вас есть только (auto)release, если вы явно сделали любой из: alloc, retain, copy, new. (Занимает некоторое время, чтобы начать доверять соглашениям.)

+1

Вы забыли новое. – JeremyP

+0

@JeremyP: спасибо. – Felixyz

1

Вы не должны выпускать линии или линии. Если вы не планируете использовать их вне области вашей функции. В этом случае вы должны сохранить их, а затем освободить их в другом месте.

+0

Сохраняется от имени вызывающего абонента? Как правило, неправильно, если метод не назван соответствующим образом. Этот случай - это то, на что рассчитана автореферат. –

+0

Нет. Я имел в виду сохранить его, если вы планируете использовать ссылку за пределами области функции. И.Е. присвойте результат переменной класса. –

+0

Возвращая его к вызывающему, он также выходит за пределы вашей функции. Но да, вы правы в назначении статической переменной. –

Смежные вопросы