從2019.2.19日記錄之后遇到的坑。(持續(xù)更新)
1.獲取系統(tǒng)控件對(duì)應(yīng)類型可能會(huì)變化
之前業(yè)務(wù)有需求想修改版本更新中AlertController的messageLabel為左對(duì)齊(默認(rèn)居中),由于之前封裝的版本更新監(jiān)測(cè)使用的為系統(tǒng)AlertController,基于這之上查閱各類資料隆圆,通過以下方法進(jìn)行查詢messageLabel并修改它的對(duì)齊方式
UIAlertController * alertVC = [UIAlertController alertControllerWithTitle:[NSString stringWithFormat:@"發(fā)現(xiàn)新版本:%@", 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];
//容錯(cuò)處理旱幼,在某種情況下 該view不是對(duì)應(yīng)的messageLabel而是uiview類型肠仪,可能會(huì)導(dǎo)致崩潰
if ([view isKindOfClass:[UILabel class]] && view != nil) {
UILabel * label = subView5.subviews[i];
if ([label.text containsString:@"發(fā)現(xiàn)新版本"]) {
}else
{
label.textAlignment = NSTextAlignmentLeft;
}
}
}
原理上 在從 suView5 中獲取到的擁有“發(fā)現(xiàn)新版本”這個(gè)text內(nèi)容的view一定為 messageLabel损晤。并且擁有UILabel的所有屬性和方法褪测。
但是在某種情況下(無法還原)可能這個(gè)view屬于(UIView)如果不加入
if ([view isKindOfClass:[UILabel class]] && view != nil)
該容錯(cuò)判斷喝滞,可能會(huì)導(dǎo)致View的類型為UIView 阁将,調(diào)用label.textAlignment = NSTextAlignmentLeft; 崩潰
2.AFN 可能導(dǎo)致內(nèi)存泄漏
在使用leaks跑應(yīng)用時(shí)定位到AFN循環(huán)引用。主要原因在于創(chuàng)建Manager時(shí) [AFHTTPSessionManage manager]方法每次都會(huì)初始化一個(gè)新的session對(duì)象右遭,我們的網(wǎng)絡(luò)層一般都封裝成單例的形式做盅,每次網(wǎng)絡(luò)請(qǐng)求都會(huì)調(diào)用[AFHTTPSessionManage manager]方法,導(dǎo)致manager無法被釋放窘哈。
解決方法:
static AFHTTPSessionManager *operation_instance;
//創(chuàng)建請(qǐng)求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];
//超時(shí)時(shí)間設(shè)置
[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加入?yún)?shù)
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;
}