Получить аргумент блока из NSInvocation с ARC
Я пытаюсь получить аргумент блока из NSInvocation в forwardInvocation NSProxy: это правильный синтаксис? Будет ли утечка памяти?
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 ответ
Да. Under ARC, it is incorrect to use
id myObject = nil; // or any object type or block type
[invocation getArgument:&myObject atIndex:index];
так как &myObject
это тип id __strong *
, ie pointer to strong reference. Whoever assigns to the strong reference pointed to by this pointer must take care to release the previous value and retain the new value. Тем не мение, getArgument:atIndex:
не делает этого
Вы правы. The two correct ways to do it you have already found: 1) do it with void *
and then assign it back into object pointer, or 2) do it with __unsafe_unretained
указатель объекта