接上個(gè),記錄下NSDictionary+Extension和NSMutableDictionary+Extension。
三、NSDictionary
+ (void)load
{
? ? staticdispatch_once_tonceToken;
? ? dispatch_once(&onceToken, ^{
? ? ? ? MethodorginalMethod =class_getInstanceMethod(NSClassFromString(@"__NSPlaceholderDictionary"),@selector(initWithObjects:forKeys:count:));
? ? ? ? MethodnewMethod =class_getInstanceMethod(NSClassFromString(@"__NSPlaceholderDictionary"),@selector(avoidCrashDictionaryWithObjects:forKeys:count:));
? ? ? ? method_exchangeImplementations(orginalMethod, newMethod);
? ? });
}
- (instancetype)avoidCrashDictionaryWithObjects:(constid? _Nonnull__unsafe_unretained*)objects forKeys:(constid? _Nonnull__unsafe_unretained*)keys count:(NSUInteger)cnt {
? ? idinstance =nil;
? ? @try{
? ? ? ? instance = [self avoidCrashDictionaryWithObjects:objects forKeys:keys count:cnt];
? ? }
? ? @catch(NSException *exception) {
? ? }
? ? @finally {
? ? ? ? returninstance;
? ? }
}
四、NSMutableDictionary
+(void)load
{
? ? staticdispatch_once_tonceToken;
? ? dispatch_once(&onceToken, ^{
? ? ? ? MethodorginalMethod =class_getInstanceMethod(NSClassFromString(@"__NSDictionaryM"),@selector(setObject:forKey:));
? ? ? ? MethodnewMethod =class_getInstanceMethod(NSClassFromString(@"__NSDictionaryM"),@selector(newsetObject:forKey:));
? ? ? ? method_exchangeImplementations(orginalMethod, newMethod);
? ? });
}
-(void)newsetObject:(id)object forKey:(id)key
{
? ? if(object !=nil) {
? ? ? ? [selfnewsetObject:objectforKey:key];
? ? }
}