緣由
最近公司項(xiàng)目更新了幾個(gè)版本,主要是客戶端配合H5上一些活動(dòng)和優(yōu)化解決一些遺留下來的問題琅拌。review代碼的過程中缨伊,發(fā)現(xiàn)項(xiàng)目在模擬器里跑時(shí)內(nèi)存使用很大,達(dá)到了130多兆进宝,趁著剛發(fā)完新版有點(diǎn)空隙刻坊,于是花了點(diǎn)時(shí)間研究了下。
雖然蘋果出了ARC(自動(dòng)內(nèi)存管理機(jī)制)党晋,我們不用花太多的時(shí)間在內(nèi)存泄漏的問題上紧唱,但在我們開發(fā)的過程中活尊,還是會(huì)因?yàn)楦鞣N原因而產(chǎn)生內(nèi)存泄漏,例如Block的循環(huán)引用漏益,delegate 寫成了 strong蛹锰,定時(shí)器沒有關(guān)閉,弱指針使用不當(dāng)?shù)鹊?/em>绰疤。
所以我們下面就簡(jiǎn)單介紹下怎么使用Xcode8自帶的Instruments中的Leaks檢測(cè)我們的程序有沒有內(nèi)存泄露和定位內(nèi)存泄露的代碼铜犬,讓我們可以更準(zhǔn)確的定位和解決問題
(分析內(nèi)存泄露不能把所有的內(nèi)存泄露查出來,有的內(nèi)存泄露是在運(yùn)行時(shí)轻庆,用戶操作時(shí)才產(chǎn)生的)
Leaks具體使用
leaks如何使用癣猾?寫的比較詳細(xì),步驟也很簡(jiǎn)單余爆,感謝網(wǎng)友分享方便瀏覽纷宇,下面也簡(jiǎn)單的寫下步驟
1、打開Leaks(兩種方式)
方式一:
方式二:
2桩砰、使用Leaks
完成步驟1之后拓春,就能看到我們應(yīng)用的體檢結(jié)果了(這里僅僅指內(nèi)存泄漏;點(diǎn)擊那個(gè)紅叉標(biāo)識(shí)顯示具體的leaks亚隅,如下圖)
哇硼莽,運(yùn)行應(yīng)用之后,還沒操作頁(yè)面呢煮纵,就這么多內(nèi)存泄漏懂鸵,也難怪模擬器跑的時(shí)候內(nèi)存占用那么多。問題是找出來行疏,但是這樣的信息真的看不懂啊匆光,怎么辦呢?不急隘擎,其實(shí)很簡(jiǎn)單殴穴,設(shè)置一個(gè)地方就好凉夯。
3货葬、設(shè)置Leaks,查找定位具體leak是什么
現(xiàn)在我們就能看出個(gè)大概究竟了劲够,我這個(gè)項(xiàng)目里一看就知道是自己封裝的AFNeteworking有問題震桶。當(dāng)然此時(shí)你還可以選中某一條雙擊,就能定位到具體代碼處征绎,如下圖.
4蹲姐、解決leak
后來仔細(xì)看了下該文件的這個(gè)方法磨取,不難發(fā)現(xiàn)確實(shí)有問題。(注意注釋if語(yǔ)句柴墩,若不加if語(yǔ)句忙厌,每次請(qǐng)求接口都創(chuàng)建一個(gè)session對(duì)象,又沒釋放江咳,那自然就造成了內(nèi)存泄漏逢净。還有session的一些設(shè)置里面,道理也是一樣歼指。)
//數(shù)據(jù)請(qǐng)求爹土,post和get
- (void)requestWithMethod:(RequestMethod)requestMethod
andUrlString:(NSString *)urlString
andParameters:(id) parameters
success:(CompletePost)success
failure:(CompleteFailure)failure
{
//session存在的話,不需要重復(fù)創(chuàng)建該對(duì)象踩身,解決內(nèi)存leak問題
// if (!session) {
session = [AFHTTPSessionManager manager];
//設(shè)置自定義代理參數(shù)
[session.requestSerializer setValue:[StaticTools setUserAgentWithParam:@"afn"] forHTTPHeaderField:@"User-Agent"];
session.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"multipart/form-data",@"text/plain", nil];
//配置https
session.securityPolicy = [self customSecurityPolicy];
session.securityPolicy.allowInvalidCertificates = YES;
// }
if (requestMethod == get) {
//[self addParaWithOriginDic:parameters] ,判斷參數(shù)是否帶token胀茵,若有的話 添加隨機(jī)數(shù)和簽名參數(shù)
[session GET:urlString parameters:[self addParaWithOriginDic:parameters] progress:^(NSProgress * _Nonnull downloadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
success(responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
failure(error);
}];
} else {
[session POST:urlString parameters:[self addParaWithOriginDic:parameters] progress:^(NSProgress * _Nonnull uploadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
success(responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
failure(error);
if (error.code == -1001) {
//做超時(shí)之后的一些操作
}
}];
}
}
放開if之后,再次檢測(cè)挟阻,發(fā)現(xiàn)之前那么多l(xiāng)eaks都不見了琼娘,果真是這個(gè)問題導(dǎo)致。(下圖雖然還有l(wèi)eak赁濒,但是一看就知道是集成的第三方微客服那邊的問題轨奄,已反饋)
結(jié)果
再次在模擬器上跑的時(shí)候,發(fā)現(xiàn)內(nèi)存確實(shí)也小了很多拒炎,70的樣子挪拟,比之前的130多確實(shí)少多了(真機(jī)上運(yùn)行內(nèi)存在40的樣子)
結(jié)語(yǔ):存在leaks雖然貌似不會(huì)影響App的審核,平時(shí)用的時(shí)候也沒出現(xiàn)奔潰击你,但是干掉leaks玉组,能健壯咋們的app,減少應(yīng)用奔潰閃退的概率丁侄,挺好惯雳!