Автоматическое освобождение объектов, созданных в потоке и переданных другому в target-C - PullRequest
0 голосов
/ 08 января 2011

У меня есть метод объекта, который создает объекты, которые затем передаются методу другого объекта в другом потоке, например:

MyClass* myClass = [[MyClass alloc] init];
[anotherClass performSelectorOnMainThread:@selector(method) withObject:myClass waitUntilDone:NO];

В методе я немедленно сохраняю объект, предполагая, что создатель каким-то образом освободит его. Мой вопрос: как мне заставить MyClass правильно высвобождать этот объект? Это правильный путь?

Моим решением было освободить объект вручную в методе. В любом случае, я вижу, что анализатор утечек по-прежнему распознает это как утечку и, по-видимому, Apple это не рекомендует, поскольку владелец несет ответственность за выпуск объекта.

Можете ли вы объяснить мне правильный способ справиться с этой ситуацией? Спасибо!

Ответы [ 2 ]

9 голосов
/ 08 января 2011

Я не совсем понимаю, чего вы пытаетесь достичь, но в целом:

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

Именно так работает performSelectorOnMainThread:withObject:waitUntilDone:.Из документации :

Этот метод сохраняет приемник и параметр arg до тех пор, пока не будет выполнен селектор.

Он сохраняет их, пока это необходимоих для выполнения своей работы.

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

MyClass* myClass = [[MyClass alloc] init]; // retained, will need it for performSelector
[anotherClass performSelectorOnMainThread:@selector(method) withObject:myClass waitUntilDone:NO];
[myClass release]; // no longer needing it.

или

MyClass* myClass = [[[MyClass alloc] init] autorelease]; // will be released automatically, but guaranteed to be retained until this method returns
[anotherClass performSelectorOnMainThread:@selector(method) withObject:myClass waitUntilDone:NO];

как у вас сейчас - утечка памяти .

Метод получения:

  • , если он использует объект только для внутреннего использования, не должен его сохранять, поскольку performSelector делает "до тех пор, пока он не будет выполнен" (метод возвращает).
  • , если это потребуется позже, его следует присвоить свойству, которое сохраняет его.
0 голосов
/ 08 января 2011

Ваш вопрос очень трудно понять, потому что вы говорите об этом объекте, этом объекте, другом объекте и используете бессмысленные имена, такие как myClass , anotherClass и метод, Остается неясным, какой объект вы намереваетесь выпустить, а какой - как протекающий.

Во всяком случае, многопоточность не добавляет особой сложности подсчету ссылок. Конечно, ваши два объекта myClass и anotherClass не являются недолговечными объектами. Поэтому, если вы используете авто-релиз, убедитесь, что счетчик ссылок не обнуляется, если все авто-релизы были выполнены.

Совершенно нормально выпустить myClass или anotherClass или оба в метод .

Вы не показываете много кода. Но то, что вы показываете, в порядке.

...