找到第三方庫中objective-C類沒公開的函式並使用NSInvocation呼叫這個函式
近來做到一個專案,用到一個第三類,裡面的引數是readonly的, 這個第三方庫只有標頭檔案,並沒有實現程式碼
裡面的引數在呼叫一個類方法後就固定了。
但引數裡面的預設值不是我想要的,但是這個引數屬性是readonly的,怎麼辦。
首先確認一下有沒有對應的setter方法
在真機除錯的時候,在debug area上點下暫停按鈕,讓控制檯可用, 在控制檯中輸入命令:(下圖中的product name;工程名字 請自己輸入)
image dump symtab (product name)
然後出來一大堆東西
參考第一張圖,我們要找的類名是 PLAudioStreamConfiguration, 在控制檯裡搜尋這個名字
發現是有對應屬性的相關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];