2015-04-22 72 views
2

我發現類0123K及其方法+(void)setEnabled:(BOOL)enabled;,我認爲這將給我我需要的,它是訪問移動數據設置。如何使用此私有API?

我發現這種方法是通過使用class-dump-z打開編譯Preferences.framework

現在我發現了this answer並試圖以這種方式訪問​​類和方法,但該類也是私有的。我怎樣才能打開這個類到Xcode?

+0

「這個類是私有的」 - 你的意思是它沒有通過Preferences.framework(即'static')的二進制符號表暴露出來嗎?因爲那樣就沒有太多你可以做... –

+0

@TheParamagneticCroissant當我嘗試在我的Xcode項目中使用它時,它不可見,所以我猜這個類定義不在我的項目中導入的任何框架中。我怎樣才能在我的項目中導入這個私有框架?對不起,我是新手。 – vrwim

回答

5

你試過調用performSelector嗎?這通常是調用私有方法的訣竅。請記住所有在Objective-C中使方法爲私有的方法是,它不在h文件中公佈。但是,如果您向對象發送消息,並且對象可以對該消息作出響應,則無論頭文件中包含什麼內容。

+0

如何從名稱中獲得類以執行選擇器?對不起,我是新手。 – vrwim

+0

@vrwim'NSClassFromString()','objc_getClass()'等等...... –

+0

如果是像+(void)setEnabled這樣的類方法,你只需調用[MyClass performSelector(@selector(myMethod)],如果它是一個實例方法你可以把它作爲類的一個實例的變量 –

2

如果它像+(void)setEnabled一個類的方法,你只需調用[MyClass performSelector(@selector(myMethod)],如果它是一個實例方法,你會說它是一個變量,它是類的一個實例: MyClass的* C = [[MyClass的頁頭] INIT] ;

[c performSelector: @selector(myMethod)] 

它變得非常棘手,當你需要傳遞參數雖然喜歡在這種情況下,因爲performSelector可以傳遞參數的唯一途徑是,如果他們沒有對象的原語。你也可以看看使用objc_msgSend。

有大量的東西在線解釋如何這兩個工作。無論哪種方式,嘗試調用私有方法都很麻煩,而且風險很大。

+0

如果我的課程不在任何可見的框架中?那我該怎麼辦? – vrwim

+0

Objective C中的所有私有方法是頭不可見。沒有頭文件,程序員不知道實現中的內容,除非他們知道,他們猜測或者他們使用反編譯器來找出隱藏的魔法。你如何發現隱藏部分的內容取決於你。一旦你知道你想調用的方法,你可以用performSelector或objc_msgSend來完成。網上有很多關於如何做到這一點的內容。 –