[英]iOS / Objective-C Meta Class and Category
我理解一個類實際上是struct( objc_class*)
的object / typedef。 每個類都有一個“支持”元類,它又有一個isa指針指向NSObject
的元類。
並且NSObject
基本上有一個指向自身的isa指針。
我們可以通過這一行獲得元類:
objc_getMetaClass("<CLASS_NAME>");
我希望到目前為止我對meta class的理解並不在這里(請糾正我,如果是的話)。
我的問題是:
1.)
我們什么時候需要處理元類? 您能否在我們需要的時候引用代碼中的示例/場景?
2.)
背景:
我正在思考第三方庫以及它們的結構。
通常它們為您提供一個類方法並返回一個類,所有其他方法都是私有/“隱藏”。 大多數情況下,雖然它們可以被子類化,但由於我們不知道init
方法,因此子類化是沒用的。
突然間我開始考慮Objective-C類別 ,從而引導我思考Objective-C元類 。
這導致我的問題#2:
是否可以通過使用Objective-C類和/或使用元類來破解這種結構(通過抓住它並在元類中直接插入類方法)? 或者甚至查找私有實例方法的名稱?
我的意圖不是“打破”任何東西,我只是非常好奇這些第三方圖書館是如何“牢不可破”的,如果它們的結構不能通過使用類別和元類來“打破”。
@Leo Natan:
1.)
什么是method_*()
?
2.)
對於Objective-C Runtime的熱愛 :
您能否舉一個示例實現 - 調整實例方法,比方說,
( 我不確定這種方法是否是一個很好的例子,因為我們可以首先覆蓋它 )
NSArray
的-count
實例方法(讓它使它返回總是計數100,例如)
3.)
所以理論上所有類(包括所有第三方庫)都可以中斷(破壞)? 換句話說, 沒有辦法創建一個“只調用此類方法 - 或者你不能使用我”的API /庫 ?
非常感謝。
希望查看,添加或修改類方法和類級信息時,元類很有用。
例如,
IMP myIMP = imp_implementationWithBlock(^(id _self, NSString *string) {
NSLog(@"Hello %@", string);
});
Class cls = objc_getMetaClass("NSString");
class_addMethod(cls, @selector(test:), myIMP, "v@:@");
[NSString test:@"lala"];
要獲得實例方法,您可以使用class_copyMethodList()
對返回的類class
方法的對象或NSClassFromString()
您將獲得該類定義的所有實例方法的數組(但不是其超類!)。 然后,您可以使用各種method_*()
方法來檢索信息,甚至可能修改這些方法(如實現調整)。
您可以在元類上調用class_copyMethodList()
以獲取定義的所有類方法。
為了解決你的“青少獅”問題,
1.請閱讀Objective C Runtime Reference 。 您可以找到處理Method
結構的method_
函數的一部分。
2.參見有關實現調配的教程 。
3.使用Objective C,運行時可以使用所有內容。 不用說,強大的力量帶來了巨大的責任。 Objective C運行時非常強大。 這些混合非常危險,通常不推薦。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.