Ios 使用ARC从NSInvocation获取块参数

Ios 使用ARC从NSInvocation获取块参数,ios,automatic-ref-counting,nsinvocation,message-forwarding,Ios,Automatic Ref Counting,Nsinvocation,Message Forwarding,我正在尝试从NSProxy的forwardInvocation中的NSInvocation获取块参数: 这是正确的语法吗?它会泄漏内存吗 typedef void(^SuccessBlock)(id object); void *successBlockPointer; [invocation getArgument:&successBlockPointer atIndex:index]; SuccessBlock successBlock = (__bridge SuccessBloc

我正在尝试从NSProxy的forwardInvocation中的NSInvocation获取块参数: 这是正确的语法吗?它会泄漏内存吗

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];
要正确释放已分配的内存,是否还需要执行其他操作


提前谢谢。

是的。在ARC下,不正确使用

id myObject = nil; // or any object type or block type
[invocation getArgument:&myObject atIndex:index];
因为
&myObject
是类型
id\uu strong*
,即指向强引用的指针。分配给此指针指向的强引用的人必须注意释放以前的值并保留新值。但是,
getArgument:atIndex:
不会这样做


你说得对。您已经找到了两种正确的方法:1)使用
void*
执行操作,然后将其分配回对象指针,或2)使用
\uuuuuunsafe\uunrepaired

对象指针执行操作。并且,我假设两种方法都不会泄漏内存?仪器没有报告任何泄漏。对于块或其他对象(非块对象),一种方法是否优于另一种方法?@pshah:是的,两种方法都是正确的内存方式。我更喜欢
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu!我真的很感谢你的帮助!当这些块作为参数传入时,是否需要复制它们?据我所知,当块作为id参数传入时,需要显式复制它们。我有一个用于最终调用forwardInvocation:的块的强类型接口(不是id)。我可以在forwardInvocation:自身中复制块吗?@pshah:你说的“当它们作为参数传入时”是什么意思?是否需要在
forwardInvocation:
中复制此块取决于您对它所做的操作。如果您只是调用调用或同步地将调用传递给一个接受块参数的方法,则为否。如果您需要以某种方式存储调用,则为是。