gpt4 book ai didi

ios - 使用 getReturnValue 的原语 NSInvocation

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:02:16 26 4
gpt4 key购买 nike

我们有以下方法,适用于对象。它接受一个对象的方法并将结果放在 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];
}

是否有可能以某种方式修改它以便我们可以从 getReturnValue 返回基元(例如 NSInteger)和对象?

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

最佳答案

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

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com