Что ваш код делает:
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
Нет, вы не получите утечки памяти с кодом. –
если str получает новую копию, тогда старая будет без ссылки, так что я не получил утечку памяти? –
Нет, поскольку вы не сохраняете этот объект, он создается с помощью метода удобства, вы его не обладаете и будете выпущены в следующем цикле пула автозапуска. –