遇坑总结

从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

原理上 在从 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;
}

你可能感兴趣的:(遇坑总结)