使用 getReturnValue 的原语 NSInvocation

NSInvocation with primitive using getReturnValue

我们有以下方法,适用于对象。它采用对象的方法并将结果放在 returnValueContainer:

+ (void)invokePrivateMethod:(SEL)selector returnValueContainer:(NSObject **)returnValueContainer onObject:(NSObject *)object {
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[[object class] instanceMethodSignatureForSelector:selector]];
    [invocation setSelector:selector];
    [invocation setTarget:object];
    [invocation invoke];
    [invocation getReturnValue:returnValueContainer];
}

是否有可能以某种方式修改它,以便我们可以 return 基元(例如 NSInteger)以及来自 getReturnValue 的对象?

背景:我们正在尝试访问 class 上的私有原语 属性 以进行单元测试。

好吧,如果您想使用 int,只需将其更改为 returnValueContainer:(int *)returnValueContainer 就足够了。如果你想让它适用于所有类型,你可以只做 returnValueContainer:(void *)returnValueContainer 并让调用者传递一个指向正确类型的指针。

(顺便说一句,你用 NSObject ** 做的事情在 ARC 中是不正确的。NSObject ** 类型的参数隐式表示 NSObject * __autoreleasing *。但正确的类型应该是 NSObject * __unsafe_unretained * 因为 getReturnValue: 只是将指向的缓冲区视为普通字节缓冲区,而不知道任何内存管理。它不会像 __autorelease 类型那样保留和自动释放它。在大多数情况下它不会有什么不同(而且被调用的方法可能会自动释放它),在某些情况下它很重要。)