Поскольку вы, вероятно, объявили свое свойство как 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 .Поскольку вы регистрируете только , сохраняет , он только выглядит как , как будто у вас есть утечки.