我们平时应该会遇到因为null导致崩溃的情况。
那么需要怎么处理这种情况呢?
看下下面的调用,需要做的是,在数据源请求下来之后调用safeTransferObject。
@implementation HHAvoidNull
+ (id)safeTransferObject:(id)inputObject
{
if ([self isNsNullType:inputObject]) {
return nil ;
}
if ([inputObject isKindOfClass:[NSDictionary class]]) {
__block NSDictionary *resObject = inputObject ;
[inputObject enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
if ([self isNsNullType:obj]) {
resObject = [resObject HHAvoidNull_dictByRemoveKey:key];
}else
{
id resultObject = [self safeTransferObject:obj];
if (resultObject && ![resultObject isEqual:obj]) {
resObject = [resObject HHAvoidNull_dictBySetObject:resultObject forKey:key];
}
}
}];
return resObject ;
}else if ([inputObject isKindOfClass:[NSArray class]])
{
__block NSArray *resObject = inputObject ;
__block NSUInteger indexOffset = 0 ;
[inputObject enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([self isNsNullType:obj]) {
NSUInteger originCount = resObject.count ;
resObject = [resObject HHAvoidNull_arrayByRemoveObjectAtIndex:idx - indexOffset];
indexOffset += originCount - resObject.count ;
}
else
{
id resultObject = [self safeTransferObject:obj];
if (resultObject && ![resultObject isEqual:obj]) {
resObject = [resObject HHAvoidNull_arrayByReplaceObjectAtIndex:idx - indexOffset withObject:resultObject];
}
}
}];
return resObject ;
}
return inputObject ;
}
/// 判断一个对象是不是 NSNull
+ (BOOL)isNsNullType:(id)object
{
return [object isKindOfClass:[NSNull class]] ;
}
@end
@implementation NSDictionary(HHAvoidNullSupport)
- (NSDictionary *)HHAvoidNull_dictByRemoveKey:(id<NSCopying>)key
{
/// key 判空
if (key == nil) {
return self.copy;
}
if ([[self allKeys] containsObject:key]) {
NSMutableDictionary *dictM = self.mutableCopy ;
[dictM removeObjectForKey:key];
return dictM.copy;
}
return nil;
}
- (NSDictionary *)HHAvoidNull_dictBySetObject:(id)aObject forKey:(id<NSCopying>)key
{
/// key 判空
if (key == nil) {
return self.copy;
}
if ([self isKindOfClass:[NSDictionary class]]) {
NSMutableDictionary *dictM = self.mutableCopy ;
dictM[key] = aObject ;
return dictM.copy;
}
return nil;
}
@end
@implementation NSArray(HHAvoidNullSupport)
- (NSArray *)HHAvoidNull_arrayByRemoveObjectAtIndex:(NSUInteger)index
{
if (index < self.count) {
NSMutableArray *arrM = self.mutableCopy ;
[arrM removeObjectAtIndex:index];
return arrM.copy;
}
return nil;
}
- (NSArray *)HHAvoidNull_arrayByReplaceObjectAtIndex:(NSUInteger)index withObject:(id)object
{
if ( index < self.count) {
NSMutableArray *arrM = self.mutableCopy ;
arrM[index] = object ;
return arrM.copy;
}
return nil;
}
``
网友评论