Я не совсем понимаю, чего вы пытаетесь достичь, но в целом:
Вам не нужно беспокоиться о том, кто и когда освобождает / освобождает объект.Вместо этого просто сохраните его, когда вы (ваш единственный объект или метод) начнут нуждаться в нем, и освободят его, когда вы перестанут нуждаться в нем (или автоматически выпустить его, в этом случаеон будет выпущен в потоке, в котором вы назвали 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
делает "до тех пор, пока он не будет выполнен" (метод возвращает). - , если это потребуется позже, его следует присвоить свойству, которое сохраняет его.