簡體   English   中英

iOS / Objective-C元類和類別

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM