遇坑总结

从2019.2.19日记录之后遇到的坑。(持续更新)
1.获取系统控件对应类型可能会变化

之前业务有需求想修改版本更新中AlertController的messageLabel为左对齐(默认居中),由于之前封装的版本更新监测使用的为系统AlertController,基于这之上查阅各类资料,通过以下方法进行查询messageLabel并修改它的对齐方式

    UIAlertController * alertVC = [UIAlertController  alertControllerWithTitle:[NSString stringWithFormat:@"发现新版本:%@", model.versionName] message:model.message preferredStyle:UIAlertControllerStyleAlert];
    UIView *subView1 = alertVC.view.subviews[0];
    UIView *subView2 = subView1.subviews[0];
    UIView *subView3 = subView2.subviews[0];
    UIView *subView4 = subView3.subviews[0];
    UIView *subView5 = subView4.subviews[0];
//                        UILabel * message = subView5.subviews[2];
//                        if ([message isKindOfClass:[UILabel class]]) {
//                            message.textAlignment = NSTextAlignmentLeft;
//                        }
    for (int i = 0 ; i<subView5.subviews.count; i++) {
          UIView * view = subView5.subviews[i];
//容错处理,在某种情况下 该view不是对应的messageLabel而是uiview类型,可能会导致崩溃
          if ([view isKindOfClass:[UILabel class]] && view != nil) {
              UILabel * label = subView5.subviews[i];
              if ([label.text containsString:@"发现新版本"]) {

               }else
              {
                    label.textAlignment = NSTextAlignmentLeft;
              }

           }
     }

原理上 在从 suView5 中获取到的拥有“发现新版本”这个text内容的view一定为 messageLabel。并且拥有UILabel的所有属性和方法。
但是在某种情况下(无法还原)可能这个view属于(UIView)如果不加入

if ([view isKindOfClass:[UILabel class]] && view != nil) 

该容错判断,可能会导致View的类型为UIView ,调用label.textAlignment = NSTextAlignmentLeft; 崩溃

2.AFN 可能导致内存泄漏

在使用leaks跑应用时定位到AFN循环引用。主要原因在于创建Manager时 [AFHTTPSessionManage manager]方法每次都会初始化一个新的session对象,我们的网络层一般都封装成单例的形式,每次网络请求都会调用[AFHTTPSessionManage manager]方法,导致manager无法被释放。
解决方法:

static AFHTTPSessionManager *operation_instance;

//创建请求manager
+(AFHTTPSessionManager *)creatManager:(ParamType)type
{
    
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        operation_instance=[AFHTTPSessionManager manager];
    });
    
    if (type == query) {
        operation_instance.requestSerializer = [AFHTTPRequestSerializer serializer];

        [operation_instance.requestSerializer setValue:@"application/x-www-form-urlencoded; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
//        [operation.requestSerializer setValue:@"text/plain" forHTTPHeaderField:@"Content-Type"];
    }else
    {
        operation_instance.requestSerializer = [AFHTTPRequestSerializer serializer];
//        [operation.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    }
    
    operation_instance.requestSerializer.HTTPShouldHandleCookies = YES;
    
    operation_instance.responseSerializer = [AFHTTPResponseSerializer serializer];
    
    //超时时间设置
    [operation_instance.requestSerializer willChangeValueForKey:@"timeoutInterval"];
    operation_instance.requestSerializer.timeoutInterval = 10;
    [operation_instance.requestSerializer didChangeValueForKey:@"timeoutInterval"];
    
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
    
    config.timeoutIntervalForRequest = 15.0;
    
    
    operation_instance.responseSerializer.acceptableContentTypes= [NSSet setWithObjects:@"multipart/form-data",@"Content-Type",@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/plain", nil];
    
    //header加入参数
  
    
    NSString* auth = [CommonUtil getValueForKey:String_Cache_AccessToken];
    if(![CommonUtil isEmpty:auth]) {
        if(Api_Debug) {
            NSLog(@"AccessToken:%@", auth);
        }
        [operation_instance.requestSerializer setValue:auth forHTTPHeaderField:@"Authorization"];
    }
    
    NSString *appCurrentVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
    
    [operation_instance.requestSerializer setValue:appCurrentVersion forHTTPHeaderField:@"x-version"];
    
    return operation_instance;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容