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 бросок должен сделать это снова сбалансированным.

Другие вопросы по тегам