iOS 解决字典闪退的问题

#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

posted @ 2023-03-30 13:55  qqcc1388  阅读(80)  评论(0)    收藏  举报