Как управлять памятью для авто-релизных объектов - PullRequest
1 голос
/ 13 декабря 2011

Я работаю над реализацией класса игральных карт и создал следующий метод:

+ (id)cardWithCard:(Card *)newCard
{
Card *card = [[[Card alloc] initWithCard:newCard] autorelease];
return card;
}

здесь я использую метод автоматического выпуска, потому что в противном случае Product-> Analyse предупреждает меня о потенциальной утечке. Все работает нормально, пока переменная myCard (которая была выделена ранее), которой было присвоено новое значение, выглядит следующим образом: myCard = [Card cardWithCard:newCard] отправляется другому методу в качестве параметра. Оказывается, там и есть мое приложение вылетает. Как мне решить эту проблему? Убрать метод автоматического выпуска, несмотря на предупреждения Analyze?

1 Ответ

2 голосов
/ 13 декабря 2011

Каждый метод или объект должен нести ответственность за сохранение интересующего его объекта.
Его проще поддерживать.(Исключение составляют методы с именами alloc, new или copy, они возвращают объект, за который вызывающая сторона отвечает за release.)

Так что вам нужно сохранитьautorelease потому что этот метод не существует после return и не сможет вызывать release для него.
Объект, который вызывает cardWithCard, должен retain объект, если он хочет, чтобы он былбольше времени этого конкретного метода.

Код должен выглядеть примерно так:

self.myCard = [Card cardWithCard:newCard];

Это в том случае, когда myCard объявляется так

* 1020.*

Таким образом, в этом случае свойство сохранит за вас и освободит этот объект, когда вы разместите новый объект в этом свойстве.(Если вы перезаписываете автоматически сгенерированный метод доступа, вам нужно будет самим управлять этим способом)

Если по какой-то причине вы не хотите использовать свойство ... ну, это ваш выбор :-)
Вам нужно будет сделать что-то вроде этого:

myCard = [[Card cardWithCard:newCard] retain];

, и вам понадобится что-то подобное позже

[myCard release];

Если это не тот же метод, анализатор будетcompline, и, если это тот же метод, вам, вероятно, не нужен retain.

...