从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;
}