Получить аргумент блока из 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
.