#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface NSDictionary (SafeAccess)
@end
NS_ASSUME_NONNULL_END
#import "NSDictionary+SafeAccess.h"
#import <objc/runtime.h>
@implementation NSDictionary (SafeAccess)
+(void)load{
///__NSPlaceholderDictionary initWithObjects:forKeys:count:
method_exchangeImplementations(
class_getInstanceMethod(NSClassFromString(@"__NSPlaceholderDictionary"), @selector(initWithObjects:forKeys:count:)),
class_getInstanceMethod(NSClassFromString(@"__NSPlaceholderDictionary"), @selector(swizzled_initWithObjects:forKeys:count:))
);
}
-(instancetype)swizzled_initWithObjects:(id _Nonnull const[])objects forKeys:(id<NSCopying> _Nonnull const[])keys count:(NSUInteger)cnt{
id safeObjects[cnt];
id safeKeys[cnt];
NSUInteger j = 0;
for (NSUInteger i = 0; i < cnt; i++) {
id key = keys[i];
id obj = objects[i];
if (!key) {
continue;
}
if (!obj) {
obj = [NSNull null];
}
safeKeys[j] = key;
safeObjects[j] = obj;
j++;
}
return [self swizzled_initWithObjects:safeObjects forKeys:safeKeys count:j];
}
@end