zoukankan      html  css  js  c++  java
  • IOS使用 swizzle 解决一些错误

    不知道你有没有经常遇到 这种 参数为 nil 的错误 或者是 数组错误。

    而且现在在 多线程中 还是 大量使用 block 的情况下 要查找起来 实在是 太费劲了

    所以 我用了个 取巧的办法(可能会导致你的逻辑错误) 用swizzle 来替换这些没验证的方法

    我是按我自己 umeng 的 错误统计来写的 给出个 例子而已

    1. +(void)callSafeCategory
    2. {
    3. NSError* error = nil;
    4. [objc_getClass("__NSPlaceholderArray") jr_swizzleMethod:@selector(initWithObjects:count:) withMethod:@selector(SY_safeInitWithObjects:count:) error:&error];
    5. LOG_Error
    6. [objc_getClass("__NSArrayI") jr_swizzleMethod:@selector(objectAtIndex:) withMethod:@selector(SY_safeObjectAtIndex:) error:&error];
    7. LOG_Error
    8. [objc_getClass("__NSArrayM") jr_swizzleMethod:@selector(objectAtIndex:) withMethod:@selector(SY_safeObjectAtIndex:) error:&error];
    9. LOG_Error
    10. [objc_getClass("__NSArrayM") jr_swizzleMethod:@selector(addObject:) withMethod:@selector(SY_safeAddObject:) error:&error];
    11. LOG_Error
    12. [objc_getClass("__NSDictionaryI") jr_swizzleMethod:@selector(objectForKey:) withMethod:@selector(SY_safeObjectForKey:) error:&error];
    13. LOG_Error
    14. [objc_getClass("__NSDictionaryM") jr_swizzleMethod:@selector(objectForKey:) withMethod:@selector(SY_safeObjectForKey:) error:&error];
    15. LOG_Error
    16. [objc_getClass("__NSDictionaryM") jr_swizzleMethod:@selector(setObject:forKey:) withMethod:@selector(SY_safeSetObject:forKey:) error:&error];
    17. LOG_Error
    18. [NSURL jr_swizzleClassMethod:@selector(fileURLWithPath:isDirectory:) withClassMethod:@selector(SY_safeFileURLWithPath:isDirectory:) error:&error];
    19. LOG_Error
    20. [NSFileManager jr_swizzleMethod:@selector(enumeratorAtURL:includingPropertiesForKeys:options:errorHandler:) withMethod:@selector(SY_safeEnumeratorAtURL:includingPropertiesForKeys:options:errorHandler:) error:&error];
    21. LOG_Error
    22. }

    然后在替换的方法里面 加入参数验证

    1.  
    2. @implementation NSArray(SYSafeCategory)
    3. -(id)SY_safeObjectAtIndex:(int)index{
    4. if(index>=0 && index < self.count)
    5. {
    6. return [self SY_safeObjectAtIndex:index];
    7. }
    8. else{
    9. #ifdef DEBUG
    10. NSAssert(NO,nil);
    11. #endif
    12. }
    13. return nil;
    14. }
    15. -(id)SY_safeInitWithObjects:(const id [])objects count:(NSUInteger)cnt
    16. {
    17. for (int i=0; i
    18. if(objects[i] == nil)
    19. return nil;
    20. }
    21. return [self SY_safeInitWithObjects:objects count:cnt];
    22. }
    23. @end
    24. @implementation NSMutableArray(SYSafeCategory)
    25. -(void)SY_safeAddObject:(id)anObject
    26. {
    27. if(anObject != nil){
    28. [self SY_safeAddObject:anObject];
    29. }
    30. }
    31. @end
      1. @implementation NSArray(SYSafeCategory)
  • 相关阅读:
    14)Java中Assert
    ajax异步请求
    前端学习数据库之子元素
    Javascript实现页面跳转的几种方式
    读书笔记:《HTML5开发手册》Web表单
    C#开发微信门户及应用(26)-公众号微信素材管理
    关于自定义滚动条原理
    jQuery点击图片弹出大图遮罩层
    CSS3新特性(阴影、动画、渐变、变形、伪元素等) CSS3与页面布局学习总结——CSS3新特性(阴影、动画、渐变、变形、伪元素等)
    jQuery点击图片弹出大图遮罩层
  • 原文地址:https://www.cnblogs.com/hanyis/p/3513843.html
Copyright © 2011-2022 走看看