NSProxy forwardInvocation: вернуть новый экземпляр NSProxy, вызвать утечку памяти
Я пытаюсь использовать NSProxy, чтобы обернуть объект и сделать экземпляр прокси в (forwardInvocation:) как invocation'retValue, но все экземпляры прокси из не могут быть освобождены в ARC. Я был обеспокоен в течение долгого времени.
демо на github: https://github.com/JorrisRaghan/proxyon
вы можете увидеть консольный журнал:
DEALLOC PPObject:...
DEALLOC Proxyon: класс
но без прокси-сервера DEALLOC: id
Вы также можете использовать инструменты для проверки утечки памяти.
поэтому мне нужна ваша помощь, чтобы решить ее, спасибо!
Обновление: я обнаружил, что эта утечка от forwardInvocation:
void *proxyon = (__bridge_retained void *)[Proxyon proxyonWithInstance:obj];
[anInvocation setReturnValue:&proxyon];
Я установил PPObject как retVal вместо экземпляра Proxyon, и утечка произошла в PPObject, поэтому я предполагаю -[NSInvocation setReturnValue:] является ключом. Но как его решить?
1 ответ
__bridge_retained
актерский состав выглядит неправильно. __bridge_retained
дает вам сохраненную ссылку. Затем вы устанавливаете это как возвращаемое значение вызова, без балансировочного выпуска, так что в результате вызов возвращает сохраненную ссылку. Но название метода, для которого это (instanceWithIdentifier:
) не начинается с alloc
, new
, retain
, copy
, или же mutableCopy
и так не должны возвращать сохраненную ссылку.
Меняя это на простое __bridge
бросок должен сделать это снова сбалансированным.