简体   繁体   中英

NSInvocation with primitive using getReturnValue

We have the following method, which works for objects. It takes a method on an object and places the result in 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];
}

Is it possible to modify this somehow so that we can return primitives (eg NSInteger) as well as objects from getReturnValue?

Background: we are trying to access a private primitive property on a class for unit tests.

Well if you wanted to do it with int , it would be enough to simply change it to returnValueContainer:(int *)returnValueContainer . If you want it to work for all types, you can just do returnValueContainer:(void *)returnValueContainer and let the caller pass in a pointer to the correct type.

(By the way, what you are doing with NSObject ** is not correct in ARC. A parameter of type NSObject ** implicitly means NSObject * __autoreleasing * . But the correct type should be NSObject * __unsafe_unretained * because getReturnValue: simply treats the buffer pointed to as a plain byte buffer without knowing anything about memory management. It does not retain and autorelease it as it should for an __autorelease type. In most cases it won't make a difference (and the method that was invoked potentially autoreleased it anyway), there are cases where it would matter.)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM