Смущенный о выделении и выпуске - PullRequest
2 голосов
/ 24 июля 2010

Я немного запутался в Objective-C и распределении / освобождении объектов.

Если я сделаю это:

NSString *myString;

if([someString isEqualToString: @"test1"]){
    myString = @"got 1";
}else{
    myString = @"got 2";
}

Должен ли я после этого выпустить myString?

И то же самое с самоопределяемыми объектами:

myOwnObject *someObject = [someArray objectAtIndex: 1];

myButton.label1.text = someObject.name;

Должен ли я выпустить someObject?

Причина, по которой я спрашиваю, заключается в том, что я получаюутечки памяти в методе, и я не могу найти, где это.Поэтому я пытаюсь выяснить, правильно ли я выполняю функции alloc / release.Утечка происходит в NSPlaceholderString (я предполагаю, что это где-то скрыто в моем NIB-файле).

Также - если у меня есть объект, выделите его, но используйте только некоторые свойства, но делайте выпуск каждогосвойство на dealloc - не вызовет ли это утечки памяти?

Извините - надеюсь, мои вопросы имеют смысл хотя бы некоторый смысл :)

Спасибо за любую помощь!

Ответы [ 3 ]

1 голос
/ 24 июля 2010

Послушай меня. Это единственное правило, которое имеет значение.


Если вы используете метод с «copy», «alloc», «new» или «retain» в имени

Вы владеете объектом и ДОЛЖНЫ позднее выпуском или автоматическим выпуском it.

Если вы этого не сделаете:

Не!

Но не ожидайте, что объект останется вне этой области, потому что вам не принадлежит .

Это так просто.


MyClass *foo = [[MyClass alloc] init];
[array addObject:foo];
[foo release];

Использовали ли вы «copy», «retain», «new» или «alloc»? Да. Отпустите.

MyClass *someObject = [someArray objectAtIndex:0];

Использовали ли вы «copy», «retain», «new» или «alloc»? Нет, не отпускай это.

НО

Если у вас есть переменная экземпляра , к которой вам нужно обратиться в других методах :

ivar = [[someArray objectAtIndex:0] retain];

Тогда вы гарантированно останетесь, потому что вы им владеете.

(Другой способ справиться с этим - с помощью @property (retain) свойств, потому что тогда вы можете сделать self.ivar = someObject, и он сохранит его для вас.)

Но не забудьте выпустить их в -dealloc!

0 голосов
/ 24 июля 2010

Чтобы ответить на ваш первый вопрос, вам не нужно освобождать строки, созданные с синтаксисом @ "".

В вашем втором примере вам не нужно выпускать someObject. Однако может возникнуть проблема, если ваш метод dealloc в вашем классе myOwnObject неправильно освободит все переменные своего экземпляра.

0 голосов
/ 24 июля 2010

Нет, вам не нужно выпускать ни один из них. Я обычно release только объекты, которые я alloc, такие как этот фрагмент:

NSString *string = [[NSString alloc] initWithFormat:@"%@", something];
// yadda yadda yadda some code...
[string release];
...