Почему мой метод сохранения вызывается при использовании средства доступа к свойству - PullRequest
0 голосов
/ 11 августа 2011

Мой объект не освобождается из памяти, поэтому я переопределяю метод retain и помещаю точку останова, чтобы увидеть, где он сохраняется в коде.

Каждый раз, когда на объект ссылаются с помощью средства доступа к свойству, метод retainназывается.Почему это происходит?

color = self.myobject.color

вызовы сохраняются.

Ответы [ 2 ]

7 голосов
/ 11 августа 2011

Синтезированный метод доступа к свойствам для сохраненных свойств выглядит примерно так:

- (UIColor *)color
{
    return [[_color retain] autorelease];
}

Следовательно, ваш retain метод вызывается, но он сбалансирован с autorelease.

См. этот фрагмент кода в Руководстве по языку программирования Objective-C для примера того, как может выглядеть синтезированный метод доступа (блокирующая часть не применяется в неатомном случае, но retain-autorelease является то же самое).

2 голосов
/ 11 августа 2011

Поскольку вы, вероятно, объявили свое свойство как retain или copy:

@property (nonatomic, retain) MyObject* myobject;

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

- (void) setMyobject: (MyObject *) value
{
    if (value != myobject)
    {
        [myobject release];
        myobject = value;
    }
}

Каждый раз, когда вы присваиваете self.myobject, этот метод вызывается с новым объектом как параметр value.Он должен освободить старый объект, но последний добавленный объект сохраняется.Вы должны будете выпустить его в свой расклад.И вы должны освободить то, что вы выделили, поэтому шаблон:

MyObject *myObj = [[MyObject alloc] init];
self.myobject = myObj;
[myObj release];

Элементы, возвращаемые методом, обычно автоматически высвобождаются, поэтому вы не должны освобождать их:

MyObject *myObj = [someOtherObject someMethod: 17];
self.myobject = myObj;
// Do NOT release myObj!

Обновление

См. Объяснение @ omz .Я неправильно прочитал и говорил о сеттер .Ваш getter также сохраняет , но это немедленно соединяется с autorelease .Поскольку вы регистрируете только , сохраняет , он только выглядит как , как будто у вас есть утечки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...