iOS: Свойства - выделение и освобождение объектов - PullRequest
2 голосов
/ 09 июня 2011

Я борюсь в iOS (4) с выделением объектов в одной области и выпуском в другой области. Я использую свойства как указатели на объекты. Объект размещается и инициализируется в одном методе класса экземпляра, и я освобождаю его в методе dealloc класса. Свойства объявлены с сохранением. Помимо проблем с использованием таких свойств, как это, я также считаю громоздким выделение, инициализацию объекта и установку свойства.

NSObject *object = [[NSObject alloc] init];
Self.myProperty = object;
[object release];

Я пытался

self.myObject = [[NSObject alloc] init];

Однако это дало мне утечку памяти.

Мой вопрос: Нужно ли создавать этот временный объект или есть более элегантный способ сделать это?

Следующий вопрос: Должен ли я установить свойство равным nil и освободить автоматически сгенерированный ivar?

[self setMyProperty:nil], [myProperty release];

Когда XCode 4 генерирует для вас заглушки свойств, он помещает [self setMyProperty: nil] в viewDidUnload и [_myProperty release] в dealloc.

Ответы [ 2 ]

2 голосов
/ 09 июня 2011

Первый вопрос:

autorelease ваш друг:

self.myObject = [[[NSObject alloc] init] autorelease];

Второй вопрос:

Нет, это избыточно, но безвредно, поскольку вторая операция ничего не даст ([nil release] безопасно). Я бы посоветовал использовать конструкцию self.XXX = nil;, так как она безопаснее и очень понятна / читаема.

1 голос
/ 09 июня 2011

Я. нотация проходит через синтезированный установщик, который выполняет сохранение, поэтому вам необходимо выполнить авто-релиз объекта init. И наоборот, вы можете оставить себя. и просто используйте

myObject = [[NSObject alloc] init;

Эта строка просто устанавливает указатель myObject на сохраненный объект, и у вас не будет никакой утечки.

Вот мой вопрос, который был в то же время, что и у вас:

Автоматический выпуск / выпуск MKReverseGeocoder в образце Apple CurrentAddress

...