13

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

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];

我是否必须做其他事情才能正确释放分配的内存?

提前致谢。

4

1 回答 1

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对象指针进行操作。

于 2013-06-05T06:16:39.203 回答