2015-04-17 6 views
0

В NSString NSString Class Reference что это означаетНужна помощь в отношении NSString

Distributed objects: 
Over distributed-object connections, mutable string objects are passed by-reference and immutable string objects are passed by-copy. 

И NSString не может быть изменен, так что же происходит, когда я меняю str в этом коде

NSString *str = @""; 
for (int i=0; i<1000; i++) { 
    str = [str stringByAppendingFormat:@"%d", i]; 
} 

я получу память утечка? Или что?

+0

Нет, вы не получите утечки памяти с кодом. –

+0

если str получает новую копию, тогда старая будет без ссылки, так что я не получил утечку памяти? –

+2

Нет, поскольку вы не сохраняете этот объект, он создается с помощью метода удобства, вы его не обладаете и будете выпущены в следующем цикле пула автозапуска. –

ответ

1

Что ваш код делает:

NSString *str = @""; // pointer str points at memory address 123 for example 
for (int i=0; i<1000; i++) { 
    // now you don't change the value to which the pointer str points 
    // instead you create a new string located at address, lets say, 900 and let the pointer str know to point at address 900 instead of 123 
    str = [str stringByAppendingFormat:@"%d", i]; // this method creates a new string and returns a pointer to the new string! 

    // you can't do this because str is immutable 
    // [str appendString:@"mmmm"]; 
} 

Mutable означает, что вы можете изменить NSString. Например, с appendString.

pass by copy означает, что вы получаете копию NSString, и вы можете делать все, что хотите; он не изменяет оригинальную NSString

- (void)magic:(NSString *)string 
{ 
    string = @"LOL"; 
    NSLog(@"%@", string); 
} 

// somewhere in your code 
NSString *s = @"Hello"; 
NSLog(@"%@", s); // prints hello 
[self magic:s]; // prints LOL 
NSLog(@"%@", s); // prints hello not lol 

Но представьте, что вы получаете изменяемый NSString.

- (void)magic2:(NSMutableString *)string 
{ 
    [string appendString:@".COM"]; 
} 

// somewhere in your code 
NSString *s = @"Hello"; 
NSMutableString *m = [s mutableCopy]; 
NSLog(@"%@", m); // prints hello 
[self magic2:m]; 
NSLog(@"%@", m); // prints hello.COM 

Поскольку вы передать ссылку вы можете изменить «значение» вашего строкового объекта, так как вы работаете с оригинальной версией и не дублировать.

ПРИМЕЧАНИЕ Строковые литералы живут так долго, как ваше приложение живет. В вашем exmaple это означает, что ваш NSString *str = @""; никогда не будет освобожден. Итак, в конце после того, как вы зациклились на вашем цикле for, в вашей памяти есть два строковых объекта. Его @"", к которому у вас нет доступа, поскольку у вас нет указателя на него, но он все еще там! И ваша новая строка str = 123456 .... 1000; Но это не утечка памяти.

more information

+0

если str получает новую копию, тогда старая будет без ссылки, так что я не получил утечку памяти? –

+0

нет, потому что ваша старая строка будет удалена. ваша старая строка живет до тех пор, пока ваш цикл «for» не продвинулся дальше. – Duc

+0

, но что делать, если я использую не-ARC. –

0

In не будет утечки памяти, но получит больше памяти, из-за того, что новая копия неизменяемой копии будет столько же триггеров цикла времени [str stringByAppendingFormat:@"%d", i];.

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

+0

если str получает новую копию, тогда старая будет без ссылки, так что я не получил утечку памяти? –

0

Вы не получите утечку памяти в примере кода, так как автоматическая Reference Counting обнаружит присвоение ул и (автоматически) освободить старую ул.

Но было бы гораздо лучше стиль кодирования (и почти наверняка более высокая производительность), чтобы сделать это:

NSMutableString* mstr = [NSMutableString new]; 
for(int i = 0; i < 1000; ++i){ 
    [mstr appendFormat:@"%d",i]; 
} 
NSString* str = mstr; 
... 

Что касается первого вопроса, то я думаю, что это означает, что изменения, внесенные в изменяемую строку по удаленный процесс будет отражен в объекте исходного процесса.

+0

если str получит новую копию, тогда старая будет без ссылки, так что я не получил утечку памяти? –

1

Нет, вы не потеряете утечку памяти с помощью своего кода, так как вы не сохраняете эти объекты в цикле, они создаются с помощью удобного метода, вы их не владеете, и они будут выпущены в следующем цикле пула авторефератов.И не имеет значения, используете ли вы ARC или нет, объекты, созданные с помощью удобных методов, и не сохраняются, публикуются везде, где они находятся вне контекста.

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