Получить аргумент блока из NSInvocation с помощью ARC

Я пытаюсь получить аргумент блока из NSInvocation в NSProxy forwardInvocation: Это правильный синтаксис? Будет ли это утечка памяти?

typedef void(^SuccessBlock)(id object);
void *successBlockPointer;
[invocation getArgument:&successBlockPointer atIndex:index];
SuccessBlock successBlock = (__bridge SuccessBlock)successBlockPointer;

Или я должен использовать?

typedef void(^SuccessBlock)(id object);
SuccessBlock successBlock;
[invocation getArgument:&successBlock atIndex:index];

Как насчет других типов аргументов, таких как объекты?

__unsafe_unretained id myObject = nil; // I don't think this could be __weak? Is that correct?
[invocation getArgument:&myObject atIndex:index];

Нужно ли мне что-то делать, чтобы правильно освободить выделенную память?

Спасибо заранее.

Ответ 1

Да. В ARC неверно использовать

id myObject = nil; // or any object type or block type
[invocation getArgument:&myObject atIndex:index];

потому что &myObject - это тип id __strong *, то есть указатель на сильную ссылку. Тот, кто назначает сильную ссылку, на которую указывает этот указатель, должен позаботиться о выпуске предыдущего значения и сохранить новое значение. Однако getArgument:atIndex: этого не делает.

Вы правы. Два правильных способа сделать это вы уже нашли: 1) сделайте это с помощью void *, а затем назначьте его обратно в указатель объекта или 2) сделайте это с указателем объекта __unsafe_unretained.