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