в первой ситуации вам нужно будет вызвать [str release];
после добавления его в массив, например:
NSMutableString *str = [[NSMutableString alloc] initWithString:@"Hello World!"];
NSMutableArray *array = [[NSMutableArray alloc] init];
[array addObject:str];
[str release];
Таким образом, array
содержит единственный вызов сохранения в строке. Как только вы выпустите array
позже, у вас не возникнет проблем с утечкой памяти.
Я немного озадачен второй ситуацией. str
вот указатель. Кажется, вы назначаете три разных объекта одному и тому же указателю:
NSMutableString *str = [[NSMutableString alloc] init]; //first object
str=@"Hello World !"; //second object
str=[self getData]; //third object
к тому времени, когда вы вызываете [str release]
, вы создали утечку памяти, потому что потеряли первую изменяемую строку. Во второй раз, когда вы позвонили str =
, вы потеряли любой способ доступа к этому первому NSMutableString
.
Предполагая, что вы хотите объединить все это (поскольку вы выбрали NSMutableString), вы можете попробовать это:
NSMutableString *str = [[NSMutableString alloc] init]; //first object
[str appendString:@"Hello World!"];
[str appendString:[self getData]];
[str release];
Если метод [self getData]
возвращает автоматически освобожденную строку, все будет в порядке. Если getData
возвращает оставшуюся строку (если вы использовали alloc
и init
), вам нужно будет присвоить ее промежуточному указателю и отпустить после добавления в str
.