所以我计划像其他人一样为 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:”。
所以我该怎么做?
有没有办法做到?
任何建议将被认真考虑。