首先帆赢,需要明確內(nèi)存泄漏的概念疟暖。內(nèi)存泄漏(Memory Leak)是指程序中已動態(tài)分配的堆內(nèi)存由于某種原因程序未釋放或無法釋放垫毙,造成系統(tǒng)內(nèi)存的浪費(fèi),導(dǎo)致程序運(yùn)行速度減慢甚至系統(tǒng)崩潰等嚴(yán)重后果钠右。
很多文章里描述:使用AFNetWorking過程中,AFHTTPSessionManager會導(dǎo)致內(nèi)存泄漏的問題忘蟹。所給出的解決方法是將AFHTTPSessionManager寫成單例飒房,用該單例進(jìn)行網(wǎng)絡(luò)請求。其實(shí)媚值,這是使用者自己的問題狠毯。
原因是,AFHTTPSessionManager繼承于AFURLSessionManager褥芒,AFURLSessionManager有個屬性session嚼松,session類型是NSURLSession,NSURLSession將代理屬性delegate強(qiáng)引用了锰扶,所以NSURLSession影響了其delegate的釋放献酗。
解決辦法是,在調(diào)用NSURLSession進(jìn)行請求后坷牛,等請求完畢后調(diào)用session的finishTasksAndInvalidate方法罕偎,或者調(diào)用取消session的invalidateAndCancel方法,再或者將session屬性置成nil京闰,這樣AFURLSessionManager就能正常釋放颜及,這樣就不需要將AFHTTPSessionManager寫成單例來使用了。
調(diào)用其中的一個invalidate方法時蹂楣,就會將其delegate引用計(jì)數(shù)減一俏站,這樣其delegate就能正常釋放了,這里的delegate就是AFURLSessionManager捐迫。
靜態(tài)分析乾翔、動態(tài)分析(Instruments—Leaks):
http://www.reibang.com/p/9fc2132d09c7
內(nèi)存檢測三方工具:
http://wereadteam.github.io/2016/02/22/MLeaksFinder/
http://www.cocoachina.com/articles/16951