簡體   English   中英

方法是否可能在靜態庫中混亂?

[英]Is Method swizzling in a static library possible?

我試圖創建一個自動UI日志記錄,我發現方法混亂是解決該問題的一種非常好的方法。 我試過了UIApplication實現的sendAction方法。

我的問題是,有時它有用,有時卻沒有。 特別是如果我在靜態庫中編寫代碼,則將其導出到.a文件並在我的項目中使用它。

  1. 如果方法在靜態庫中實現,是否應該成為問題?

  2. 即使在代碼中,它有時也起作用,有時什么也沒發生。 它總是進入load方法,但不總是進入heap_sendAction方法。

這是代碼:

#import <objc/runtime.h>

@implementation UIApplication (EventAutomator)

+ (void)load 
{
    Class class = [self class];
    SEL originalSelector = @selector(sendAction:to:from:forEvent:);
    SEL replacementSelector = @selector(heap_sendAction:to:from:forEvent:);

    Method originalMethod = class_getInstanceMethod(class, originalSelector);
    Method replacementMethod = class_getInstanceMethod(class, replacementSelector);
    method_exchangeImplementations(originalMethod, replacementMethod);
}

- (BOOL)heap_sendAction:(SEL)action to:(id)target from:(id)sender forEvent:(UIEvent *)event 
{
    NSString *selectorName = NSStringFromSelector(action);
    printf("Selector %s occurred.\n", [selectorName UTF8String]);
    return [self heap_sendAction:action to:target from:sender forEvent:event];
}

@end

-----更新----:

當我將函數放在viewcontroller.m類中時,將調用heap_sendAction。 我現在正在嘗試不同的代碼位置,以查看它何時起作用,何時不起作用。

Apple文檔中獲取有關load方法的信息

加載消息將發送到同時動態加載和靜態鏈接的類和類別,但前提是新加載的類或類別實現了可以響應的方法。

初始化的順序如下:

  1. 您鏈接到的任何框架中的所有初始化程序。

  2. 圖片中的所有+ load方法。

  3. 圖像中的所有C ++靜態初始化程序和C / C ++ 屬性 (構造函數)功能。

  4. 鏈接到您的框架中的所有初始化程序。

此外:

  • 類的+ load方法在其所有超類的+ load方法之后調用。

  • 類+ load方法在類自己的+ load方法之后被調用。

因此,即使在靜態庫中,方法轉換也不是問題,因為此時鏈接到框架的類已經加載。 method_exchangeImplementations應該可以按預期工作。 看來問題出在別的地方。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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