2010-11-23 2 views
0

У меня есть некоторые проблемы во время, когда и какой объект будет выпускатьпроблемы при освобождении объекта

Вы можете сказать, мои знания в этом направлении меньше

я есть следующие условия, пожалуйста, предложите мне ответ соответственно

  • ситуация-1

NSMutableString * ул = [[NSMutableString Alloc] initWithFormat: @ "Hello World!"];
NSMutableArray * array = [[NSMutableArray alloc] init];
[array addObject: str];

Теперь, когда я попытался освободить str, тогда использование массива затронуло бы в будущем ... и Vice Versa
Скажите, могу ли я освободить оба?

  • ситуация-2

NSMutableString * ул = [[NSMutableString Alloc] инициализации]; str = @ "Hello World!";
str = [self getData]; // вызов метода, который возвращает строку
[str release];

Я думаю, что я творю утечку памяти здесь (как ее решить?)

очистите эти ситуации

ответ

2

в первой ситуации, вам необходимо позвонить [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 
[email protected]"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] возвращает autoreleased строку, вы будете в порядке. Если getData возвращает сохраненную строку (если вы использовали alloc и init), вам необходимо назначить ее промежуточному указателю и отпустить ее после добавления ее в str.

+0

Вы означаете, что нет никаких проблем с моим вторым случаем (если я возвращать строку autorelease)? – Saawan 2010-11-23 05:25:57

0

Какова необходимость создания NSMutableString можно непосредственно использовать NSString для этой цели

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