iOS開発_HOOK
6638 ワード
NSURLRequestを使用すると、リクエストアドレスURLが入力されますが、URLに中国語があれば、NSURLRequestのリクエストアドレスが空になることがわかります 1 2 3 4 5 6 7 8
改善する方法はありますか?やってみる
NSURLから継承されたクラスを作成し、HOOKと名付けて新しいメソッドを作成します. 1 2 3 4 5 6 7 1 2 3 4 5 6 7 8 9 10 11 12
このとき、ViewController.hでNSURL+HOOK.hファイルをインポートする必要があります.また、呼び出しのメソッド名HK_を変更する必要があります.URLWithString 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
もっと簡潔な方法はありませんか?Runtime実行時にメソッド呼び出しの順序を変更し、NSURL+HOOK.mでファイルを変更できます. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
この場合、ViewController.hファイルでは最初のコードを使用しますが、1つのコードを変更する必要はありません. 1 2 3 4 5 6 7
私たちは私たちの目的を達成することができます.この方法は詐欺と呼ばれています.利用しているのがruntimeのHOOKです.
しかし、プログラムは私たちが想像していたように順調に動作していないのではなく、カードが死んでいることに気づきました.
これは,メッセージ送信時の真の方法を修正したためである.
実際に実行されているのはHK_URLWithStringでは、NSURL+HOOK.mファイルでURLWithStringメソッドを呼び出しましたが、実際に実行されているのはそれ自体なので、ループを繰り返すことなく、プログラムメモリが急増し、カードがクラッシュします.どうやって解決しますか?簡単です.NSURL+HOOK.mファイルのURLWithStringをHK_に置き換えます.URLWithString
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
実行すると、私たちが想定した目的を達成できることがわかりました.元のプロジェクトのコードを修正する必要はなく、NSURL+HOOK.hとNSURL+HOOK.mをプロジェクトにドラッグするだけで実現できます. 1 2
gitHubの例:https://github.com/Goddreamwt/iOS_HOOK.git
- (void)viewDidLoad {
[super viewDidLoad];
NSURL * url =[NSURL URLWithString:@"http://www.baidu.com/ "];
NSURLRequest * request =[NSURLRequest requestWithURL:url];
NSLog(@"%@",request);
}
//2018-04-23 10:08:23.719236+0800 003-HOOK[947:5550247] { URL: (null) }
改善する方法はありますか?やってみる
NSURLから継承されたクラスを作成し、HOOKと名付けて新しいメソッドを作成します.
#import
@interface NSURL (HOOK)
+(instancetype)HK_URLWithString:(NSString *)URLString;
@end
#import "NSURL+HOOK.h"
@implementation NSURL (HOOK)
+(instancetype)HK_URLWithString:(NSString *)URLString{
NSURL * url = [NSURL URLWithString:URLString];
if(url ==nil){
NSLog(@" ");
}
return url;
}
@end
このとき、ViewController.hでNSURL+HOOK.hファイルをインポートする必要があります.また、呼び出しのメソッド名HK_を変更する必要があります.URLWithString
#import "ViewController.h"
#import "NSURL+HOOK.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSURL * url =[NSURL HK_URLWithString:@"http://www.baidu.com/ "];
NSURLRequest * request =[NSURLRequest requestWithURL:url];
NSLog(@"%@",request);
}
//2018-04-23 10:30:38.145984+0800 003-HOOK[1168:5566807]
//2018-04-23 10:30:38.146393+0800 003-HOOK[1168:5566807] { URL: (null) }
もっと簡潔な方法はありませんか?Runtime実行時にメソッド呼び出しの順序を変更し、NSURL+HOOK.mでファイルを変更できます.
//
// NSURL+HOOK.m
// 003-HOOK
//
// Created by mac on 2018/4/23.
// Copyright © 2018 mac. All rights reserved.
// HOOK?
/**
Runtime
*/
#import "NSURL+HOOK.h"
#import
@implementation NSURL (HOOK)
+(void)load{
// Method
Method URLWithStr = class_getClassMethod(self, @selector(URLWithString:));
Method HKWithStr = class_getClassMethod(self, @selector(HK_URLWithString:));
// IMP
method_exchangeImplementations(URLWithStr, HKWithStr);
}
// URLWithString
//+(instancetype)URLWithString:(NSString *)URLString{
// NSURL *
//}
+(instancetype)HK_URLWithString:(NSString *)URLString{
NSURL * url = [NSURL URLWithString:URLString];
if(url ==nil){
NSLog(@" ");
}
return url;
}
@end
この場合、ViewController.hファイルでは最初のコードを使用しますが、1つのコードを変更する必要はありません.
- (void)viewDidLoad {
[super viewDidLoad];
NSURL * url =[NSURL URLWithString:@"http://www.baidu.com/ "];
NSURLRequest * request =[NSURLRequest requestWithURL:url];
NSLog(@"%@",request);
}
私たちは私たちの目的を達成することができます.この方法は詐欺と呼ばれています.利用しているのがruntimeのHOOKです.
しかし、プログラムは私たちが想像していたように順調に動作していないのではなく、カードが死んでいることに気づきました.
これは,メッセージ送信時の真の方法を修正したためである.
実際に実行されているのはHK_URLWithStringでは、NSURL+HOOK.mファイルでURLWithStringメソッドを呼び出しましたが、実際に実行されているのはそれ自体なので、ループを繰り返すことなく、プログラムメモリが急増し、カードがクラッシュします.どうやって解決しますか?簡単です.NSURL+HOOK.mファイルのURLWithStringをHK_に置き換えます.URLWithString
#import "NSURL+HOOK.h"
#import
@implementation NSURL (HOOK)
+(void)load{
// Method
Method URLWithStr = class_getClassMethod(self, @selector(URLWithString:));
Method HKWithStr = class_getClassMethod(self, @selector(HK_URLWithString:));
// IMP
method_exchangeImplementations(URLWithStr, HKWithStr);
}
// URLWithString?
//+(instancetype)URLWithString:(NSString *)URLString{
// NSURL *
//}
+(instancetype)HK_URLWithString:(NSString *)URLString{
NSURL * url = [NSURL HK_URLWithString:URLString];
if(url ==nil){
NSLog(@" ");
}
return url;
}
@end
実行すると、私たちが想定した目的を達成できることがわかりました.元のプロジェクトのコードを修正する必要はなく、NSURL+HOOK.hとNSURL+HOOK.mをプロジェクトにドラッグするだけで実現できます.
2018-04-23 11:22:36.367259+0800 003-HOOK[1748:5624887]
2018-04-23 11:22:36.367636+0800 003-HOOK[1748:5624887] { URL: (null) }
gitHubの例:https://github.com/Goddreamwt/iOS_HOOK.git