[英]Is Method swizzling in a static library possible?
我試圖創建一個自動UI日志記錄,我發現方法混亂是解決該問題的一種非常好的方法。 我試過了UIApplication
實現的sendAction
方法。
我的問題是,有時它有用,有時卻沒有。 特別是如果我在靜態庫中編寫代碼,則將其導出到.a文件並在我的項目中使用它。
如果方法在靜態庫中實現,是否應該成為問題?
即使在代碼中,它有時也起作用,有時什么也沒發生。 它總是進入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。 我現在正在嘗試不同的代碼位置,以查看它何時起作用,何時不起作用。
加載消息將發送到同時動態加載和靜態鏈接的類和類別,但前提是新加載的類或類別實現了可以響應的方法。
初始化的順序如下:
您鏈接到的任何框架中的所有初始化程序。
圖片中的所有+ load方法。
圖像中的所有C ++靜態初始化程序和C / C ++ 屬性 (構造函數)功能。
鏈接到您的框架中的所有初始化程序。
此外:
類的+ load方法在其所有超類的+ load方法之后調用。
類+ load方法在類自己的+ load方法之后被調用。
因此,即使在靜態庫中,方法轉換也不是問題,因為此時鏈接到框架的類已經加載。 method_exchangeImplementations
應該可以按預期工作。 看來問題出在別的地方。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.