我们有以下方法,该方法适用于对象。它在对象上采用一种方法,并将结果放入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];
}

是否可以以某种方式修改此设置,以便我们可以返回原语(例如NSInteger)以及getReturnValue中的对象?

背景:我们正在尝试访问类的 private 原始属性以进行单元测试。

最佳答案

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

(顺便说一句,您在ARC中对NSObject **所做的操作是不正确的。类型NSObject **的参数隐式表示NSObject * __autoreleasing *。但是正确的类型应该是NSObject * __unsafe_unretained *,因为getReturnValue:只是将指向的缓冲区视为纯字节缓冲区,而不了解任何内容。内存管理。它不会像对__autorelease类型那样保留并自动释放它。在大多数情况下,它不会有所作为(并且调用的方法可能会自动释放它),在某些情况下,这很重要。

关于ios - 使用getReturnValue与原语的NSInvocation,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28499322/

10-11 15:59