1

所以我计划像其他人一样为 NSDictionary 创建一个安全的初始化函数,但因为我是一名 SDK 开发人员:

  • 我想为它添加一个开关,用户可以决定是否要打开它;

  • 我不想使用 Category 来实现它。

所以我创建了一个名为“ALDictionarySafeFunction.h”的全新类,它有两个功能,第一个是开关功能,如下所示:

+(void)enableSafeFunction{
    [ALSwizzlingHelper swizzleSelector:@selector(initWithObjects:forKeys:count:)
                           ofClass:NSClassFromString(@"__NSPlaceholderDictionary")
              withSwizzledSelector:@selector(safeInitWithObjects:forKeys:count:)
                           ofClass:[ALDictionarySafeFunction class]];
}

ALSwizzlingHelper 可以帮助我调配两个函数。

第二个是安全的初始化函数,像这样:

-(instancetype)safeInitWithObjects:(const id _Nonnull __unsafe_unretained *)objects forKeys:(const id _Nonnull __unsafe_unretained *)keys count:(NSUInteger)cnt {
    BOOL containNilObject = NO;
    for (NSUInteger i = 0; i < cnt; i++) {
        if (objects[i] == nil) {
            containNilObject = YES;
            NSLog(@"There is a nil object(key: %@)", keys[i]);
        }
    }
    if (containNilObject) {
        //Do something to make sure that it won't cause a crash even it has some nil value
    }

    //There is the problem, next line
    [self safeInitWithObjects:objects forKeys:keys count:cnt];
}

对于正常情况(在Category中编写swizzled方法),我需要像我写的那样调用原始方法。

但问题是我不能在这里做,因为“self”对象是“__NSPlaceholderDictionary”的实例,而“__NSPlaceholderDictionary”类没有实例方法“safeInitWithObjects:forKeys:count:”。

所以我该怎么做?

有没有办法做到?

任何建议将被认真考虑。

4

0 回答 0