我正在尝试从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];
我是否还需要做其他事情才能正确释放分配的内存?
提前致谢。
答案 0 :(得分:13)
是。在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
对象指针执行此操作。