{"id":1409,"date":"2018-11-23T09:06:26","date_gmt":"2018-11-23T01:06:26","guid":{"rendered":"http:\/\/www.yusian.com\/blog\/?p=1409"},"modified":"2018-11-27T17:21:00","modified_gmt":"2018-11-27T09:21:00","slug":"%e5%88%a9%e7%94%a8runtime%e6%8b%a6%e6%88%aa%e7%b3%bb%e7%bb%9f%e7%b1%bb%e5%af%b9%e8%b1%a1%e6%96%b9%e6%b3%95%e8%b0%83%e7%94%a8","status":"publish","type":"post","link":"https:\/\/www.yusian.com\/blog\/project\/2018\/11\/23\/0906261409.html","title":{"rendered":"\u5229\u7528runtime\u62e6\u622a\u7cfb\u7edf\u7c7b\u5bf9\u8c61\u65b9\u6cd5\u8c03\u7528"},"content":{"rendered":"<pre lang=\"objc\" line=\"1\">\r\n#import \"ViewController.h\"\r\n#import <objc\/runtime.h>\r\n\r\n\r\n@interface NSMutableArray (SA)\r\n@end\r\n@implementation NSMutableArray (SA)\r\n+ (void)load\r\n{\r\n    static dispatch_once_t onceToken;\r\n    \/\/ \u5355\u6b21\u6267\u884c\r\n    dispatch_once(&onceToken, ^{\r\n        \/\/ NSArray\u4e3a\u7c7b\u7c07\uff0cinsertObject:atIndex:\u7684\u5b9e\u9645\u8c03\u7528\u7c7b\u4e3a__NSArrayM\r\n        Class cls = NSClassFromString(@\"__NSArrayM\");\r\n        \/\/ \u4ea4\u6362\u539f\u65b9\u6cd5\u4e0e\u81ea\u5b9a\u4e49\u65b9\u6cd5\u7684\u5b9e\u73b0\r\n        Method origin = class_getInstanceMethod(cls, @selector(insertObject:atIndex:));\r\n        Method hook = class_getInstanceMethod(cls, @selector(sa_insertObject:atIndex:));\r\n        method_exchangeImplementations(origin, hook);\r\n    });\r\n}\r\n\/\/ insertObject:atIndex:\u65b9\u6cd5\u7684\u5b9e\u9645\u6267\u884c\r\n- (void)sa_insertObject:(id)anObject atIndex:(NSUInteger)index\r\n{\r\n    \/\/ 1\u3001\u62e6\u622a\u539f\u65b9\u6cd5\u9700\u8981\u6267\u884c\u7684\u52a8\u4f5c\u5728\u8fd9\u91cc\u5b9e\u73b0\r\n    if (anObject == nil) return;\r\n    \/\/ 2\u3001\u8c03\u56de\u539f\u65b9\u6cd5\u4fdd\u8bc1\u5b8c\u6574\u6027\uff0c\u7531\u4e8e\u65b9\u6cd5\u5b9e\u73b0\u4e92\u6362\uff0c\u6240\u4ee5\u8c03\u7528\u5f53\u524d\u65b9\u6cd5\u5373\u4e3a\u8c03\u7528\u539f\u65b9\u6cd5\r\n    [self sa_insertObject:anObject atIndex:index];\r\n}\r\n@end\r\n\r\n@interface NSMutableDictionary (SA)\r\n@end\r\n@implementation NSMutableDictionary (SA)\r\n+ (void)load\r\n{\r\n    static dispatch_once_t onceToken;\r\n    dispatch_once(&onceToken, ^{\r\n        Class cls = NSClassFromString(@\"__NSDictionaryM\");\r\n        Method origin = class_getInstanceMethod(cls, @selector(setObject:forKey:));\r\n        Method hook = class_getInstanceMethod(cls, @selector(sa_setObject:forKey:));\r\n        method_exchangeImplementations(origin, hook);\r\n    });\r\n}\r\n- (void)sa_setObject:(id)anObject forKey:(id<NSCopying>)aKey\r\n{\r\n    if (anObject == nil) return;\r\n    [self sa_setObject:anObject forKey:aKey];\r\n}\r\n@end\r\n\r\n@implementation ViewController\r\n- (void)viewDidLoad\r\n{\r\n    [super viewDidLoad];\r\n    NSMutableArray *array = [NSMutableArray array];\r\n    \/\/ \u9a8c\u8bc1\u53ef\u53d8\u6570\u7ec4\u6dfb\u52a0\u7a7a\u5bf9\u8c61\u662f\u5426\u4f1a\u629b\u51fa\u5f02\u5e38\r\n    [array addObject:nil];\r\n    \r\n    NSMutableDictionary *dict = [NSMutableDictionary dictionary];\r\n    \/\/ \u9a8c\u8bc1\u53ef\u53d8\u5b57\u5178\u6dfb\u52a0\u7a7a\u5bf9\u8c61\u662f\u5426\u4f1a\u629b\u51fa\u5f02\u5e38\r\n    [dict setObject:nil forKey:@\"name\"];\r\n    \r\n    NSLog(@\"---------\");\r\n}\r\n\r\n@end<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>#import &#8220;ViewController.h&#8221; #import @interface NSMutableArray (SA) @end @implementation NSMutableArray (SA) + (void)load { static dispatch_once_t onceToken; \/\/ \u5355\u6b21\u6267\u884c dispatch_once(&#038;onceToken, ^{ \/\/ NSArray\u4e3a\u7c7b\u7c07\uff0cinsertObject:atIndex:\u7684\u5b9e\u9645\u8c03\u7528\u7c7b\u4e3a__NSArrayM Class cls = NSClassFromString(@&#8221;__NSArrayM&#8221;); \/\/ \u4ea4\u6362\u539f\u65b9\u6cd5\u4e0e\u81ea\u5b9a\u4e49\u65b9\u6cd5\u7684\u5b9e\u73b0 Method origin = class_getInstanceMethod(cls, @selector(insertObject:atIndex:)); Method hook = class_getInstanceMethod(cls, @selector(sa_insertObject:atIndex:)); method_exchangeImplementations(origin, hook); }); } \/\/ insertObject:atIndex:\u65b9\u6cd5\u7684\u5b9e\u9645\u6267\u884c &#8211; (void)sa_insertObject:(id)anObject atIndex:(NSUInteger)index { \/\/ 1\u3001\u62e6\u622a\u539f\u65b9\u6cd5\u9700\u8981\u6267\u884c\u7684\u52a8\u4f5c\u5728\u8fd9\u91cc\u5b9e\u73b0 if (anObject == nil) return; [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11],"tags":[179,180],"class_list":["post-1409","post","type-post","status-publish","format-standard","hentry","category-project","tag-runtime","tag-180"],"_links":{"self":[{"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/posts\/1409","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/comments?post=1409"}],"version-history":[{"count":0,"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/posts\/1409\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/media?parent=1409"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/categories?post=1409"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/tags?post=1409"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}