您现在的位置:首页 >> 前端 >> 内容

找到第三方库中objective-C类没公开的函数并使用NSInvocation调用这个函数

时间:2017/9/7 9:30:00 点击:

  核心提示:近来做到一个项目,用到一个第三类,里面的参数是readonly的, 这个第三方库只有头文件,并没有实现代码 里面的参数在调用一个类方法后就固定了。但参数里面的默认值不是我想要的,但是这个参数属性是re...

近来做到一个项目,用到一个第三类,里面的参数是readonly的, 这个第三方库只有头文件,并没有实现代码

找到第三方库中objective-C类没公开的函数并使用NSInvocation调用这个函数

里面的参数在调用一个类方法后就固定了。

但参数里面的默认值不是我想要的,但是这个参数属性是readonly的,怎么办。

首先确认一下有没有对应的setter方法

在真机调试的时候,在debug area上点下暂停按钮,让控制台可用, 在控制台中输入命令:(下图中的product name;工程名字 请自己输入)

image dump symtab (product name)

然后出来一大堆东西

找到第三方库中objective-C类没公开的函数并使用NSInvocation调用这个函数

参考第一张图,我们要找的类名是 PLAudioStreamConfiguration, 在控制台里搜索这个名字

找到第三方库中objective-C类没公开的函数并使用NSInvocation调用这个函数

发现是有对应属性的相关setter方法的,

在代码里没法直接调用这个方法,然而,我们可以直接调用performSelector 和 NSInvocation;

因为NSInvocation支持多个参数,虽然这里面setter方法只有一个参数,但我也建议用NSInvocation, 以下就是我调用setAudioSampleRate:来修改audioSampleRate的代码了

SEL selector = NSSelectorFromString(@"setAudioSampleRate:");

NSMethodSignature *signature = [[PLAudioStreamingConfiguration class] instanceMethodSignatureForSelector:selector];

NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];

invocation.target = audioConfiguration;

invocation.selector = selector;

PLAACSampleRate sampleRate = PLAACSampleRate48000HZ;// 这里是一个enum值

//这里的Index要从2开始,以为0跟1已经被占据了,分别是self(target),selector(_cmd)

[invocation setArgument:&sampleRate atIndex:2];

[invocation invoke];

作者:网络 来源:j10a的专栏