1. 程式人生 > >找到第三方庫中objective-C類沒公開的函式並使用NSInvocation呼叫這個函式

找到第三方庫中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];