после самостоятельного освобождения - PullRequest
2 голосов
/ 06 июня 2011

Я использую стороннюю библиотеку Objective-C, которая делает веб-запрос в фоновом потоке, а затем возвращает результат с помощью [self performSelectorOnMainThread:...], который затем вызывает метод делегата.Я понимаю, что мне нужно nil ссылка на делегат перед освобождением делегата, но мне было интересно, что произойдет, если этот запрашивающий объект сам будет освобожден во время работы фонового потока.Будет ли эта внутренняя ссылка self установлена ​​на nil, чтобы вызов -performSelectorOnMainThread: был безвредным, или здесь есть вероятность сбоя?

Ответы [ 2 ]

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

Если ваш объект освобожден до завершения метода в главном потоке, у вас есть проблема с управлением памятью. Семейство методов performSelectorOnMainThread:… приводит к тому, что приемник сохраняется до тех пор, пока он не выполнит свою работу, поэтому единственный способ, которым он может быть освобожден, - это если вы перевыпускаете объект.

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

Насколько я понимаю ваш сценарий (но, возможно, вам следует включить некоторый код), оператор:

 [self performSelectorOnMainThread:...]

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

Если это так, то при первом отсоединении NSThread вы передаете емуtarget объект (ваш self) и NSThread будут retain, пока переданный selector не завершен.Это будет включать ваш [self performSelectorOnMainThread:...], поэтому, если кто-то не сильно помешается на releases, не должно быть никаких шансов для освобождения self до выполнения [self performSelectorOnMainThread:...].

Если ваш вопрос был именнопроизойдет, если кто-то испортит releases, я подумаю об этом еще раз.

...