2010-07-17 2 views
3

Если у меня есть методNSString * строка = @ "SomeString" против NSString * строка = [[NSString Alloc] initWithFormat @ "% @", строка]

- (void) myMethod:(NSString *)string { 
    [Object anothermethodWithString:string]; 
} 

и я называю

[Object myMethod:@"this is a string with no alloc statement"] 

мне нужно сделать что-то вроде

- (void) myMethod:(NSString *)string { 
    NSString *string2 = [[NSString alloc] initWithFormat:@"%@", string]; 
    [Object anothermethodWithString:string2]; 
    [string2 release]; 
} 

вместо пути я MyMethod раньше? У меня неправильный код, который, по-видимому, вызван тем, что строка автоматически освобождается, а второй метод в другом методе вызывается (как в примере). Во-вторых, у меня есть myMethod, который исправил все мои проблемы.

Значит, строка «non-alloc» является автоматически выпущенной строкой? Я задал этот вопрос в качестве ответа на другой вопрос (который был совершенно не связан и почему я создаю этот пост), и несколько источников сказали, что мне не нужно перераспределять строку. Я смущен, потому что поведение моего кода говорит мне об обратном.

+0

Вы вызывали 'new',' alloc', 'keep' или' copy' для создания строки? Если нет, то вы не отвечаете за его освобождение. Константные строки ('@" "') являются глобальными и постоянными. –

+0

Нет Я не вызывал ни одного из этих методов в строке, переданной в myMethod. Моя постоянная строка @ ", похоже, перезаписывается. –

ответ

4

Дейва Правильно. Вам нужно только беспокоиться о том, чтобы позвонить release на объекты, которые вы new, alloc, retain, или copy.

Вышеприведенное правило работает очень хорошо, но если вам любопытно и хотите подробно разобраться, я предлагаю прочитать Memory management Programming Guide из документов Apple. Он свободен и переходит от базовых концепций к множеству деталей.

2

Если вы используете: NSString * str = @ "". Это своего рода постоянный, вам не нужно делать какое-либо управление памятью.

Если вы вызываете из метода: NSString * str = [NSString stringWithFormat: @ ""], str уже автореализован.

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

Конвенция общей памяти: если вы делаете что-то с новым, Alloc, сохранить или копию, вы должны освободить его самостоятельно, либо в других случаях, объект autoreleased, не освобождают его

+0

«Если вы используете: NSString * str = @" ". Это своего рода константа, вам не нужно управлять памятью". Означает ли это, что это может быть автоматически выпущено там, где я этого не хочу? –

+1

@vodkhang Это не правило. Правило: если метод, используемый для создания объекта, содержит один из 'new',' alloc', 'keep' или' copy', тогда вы должны «освободить» его. 'init' нет в этом списке. Вы должны освободить его, потому что вы «alloc''d его, а не потому, что вы« init''d его. –

+1

Строки @ayanonagon, созданные с помощью '@" "', являются константными строками и * не могут быть освобождены. Они существуют в разделе глобальной памяти вашего процесса и будут там от 'exec' до' exit'. –

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