iOS內(nèi)存優(yōu)化

1、運行MemoryProblems后皿淋,運行崩潰出現(xiàn)EXC_BAD_ACCESS,啟動NSZombieEnabled恬试,選中Edit Scheme并點擊窝趣,Run -> Diagnostics -> Enable Zombie Objects(懸掛指針的檢測),設置完之后训柴,再次運行和點擊頁面哑舒,雖然會再次crash,但這次控制臺打印了有用信息幻馁,點擊Continue program execution按鈕繼續(xù)運行洗鸵,對比找到相同地址并修改(啟動MallocStackLogging)

常見原因:某變量被assign修飾,對變量值后宣赔,它的對象就馬上釋放预麸,而變量也不是strong而是weak,此時仍然使用就會導致程序crash

2儒将、手動靜態(tài)分析:應用Product—>Analyze或快捷鍵shift + command + b進行內(nèi)存泄漏的初步檢測

????自動靜態(tài)分析:在Build Settings啟用Analyze During 'Build'吏祸,每次編譯時都會自動靜態(tài)分析

3、可以在xcode的build setting中打開implicit retain of ‘self’ within blocks钩蚊,xcode編譯器會給出警告贡翘,逐個排查警告

4、應用Leak Instrument進行內(nèi)存泄露查找:點擊Xcode的菜單欄的?Product?->?Profile?啟動Instruments砰逻,出現(xiàn)Instruments的工具集鸣驱,選中Leaks子工具點擊,點擊紅色圓點按鈕啟動Leaks工具蝠咆,在Leaks工具啟動同時踊东,模擬器或真機也跟著啟動,啟動Leaks工具后刚操,它會在程序運行時記錄內(nèi)存分配信息和檢查是否發(fā)生內(nèi)存泄露

首先點擊Leak Checks時間條那個紅色叉闸翅,點擊紅色叉后,下面顯示Leaks By Backtrace菊霜,雙擊某行內(nèi)存泄露調(diào)用棧坚冀,會直接跳到內(nèi)存泄露代碼位置

Leak Instrument有Cycles & Roots界面:Persistent Bytes和#Persistent。#Persistent是object的數(shù)量鉴逞,也就是allocation的次數(shù)记某,而Persistent Bytes是具體的內(nèi)存大小司训。#Persistent是我們需要關注的,內(nèi)存有沒有泄露也是看這個值是不是只增不減液南。

Allocations:啟動Allocations壳猜,勾選列表最上邊的,右邊設置勾選:Discard unrecorded data upon stop贺拣、Identify virtual C++ objects蓖谢、* isContain…Record?

列表勾選VM

Generation Analysis

這個功能是非常有用的,一般是這樣用的:進入一個頁面前mark一下譬涡,在退出這個頁面的時候再mark一下可以比較哪些內(nèi)容增加了闪幽,就可以具體分析哪些內(nèi)存沒有被釋放

Call Tree:需要我們把列表展示類型切換成Call Trees,能夠非常清晰的看到調(diào)用樹

Separate by Category:按照類別隔開涡匀,我們鉤上看看效果

Separate by Thread:按照線程劃分盯腌,我個人不是很喜歡這種劃分,因為我不是很關心線程

Invert Call Tree:反轉(zhuǎn)調(diào)用陨瘩,我們給一張對比圖就不需要解釋了

Hide System Libraries:這個似乎是必鉤的腕够,因為我們目前只關心自己的方法,不關心系統(tǒng)的

Flatten Recursion:扁平化遞歸

Data Mining:數(shù)據(jù)挖掘舌劳,這是一個很具有噱頭的功能

點擊Symbol帚湘、Library會自動把你選中的行的符號、庫加到小框中

符號和庫有兩個選項甚淡,就是是否過濾改行大诸;點擊Restore會去掉小框中的選中行

5、通過查看dealloc是否調(diào)用查看某個class是否泄漏問題

- (void)dealloc

{

?NSLog(@"release XXXXViewController");

}

方法:?__weak?XXXXViewController?*weakSelf =?self;在Block里用weakSelf

常見問題:

1贯卦、UITextField在iOS 11內(nèi)存泄漏問題:UITextField沒釋放原因使用secureTextEntry屬性资柔,解決方案

- (BOOL)textFieldShouldBeginEditing:(UITextField?*)textField {

?if?(textField ==?self.passWordTextField) {

textField.secureTextEntry?=?YES;

}else?{

textField.secureTextEntry?=?NO;

? ? }

?return?YES;

}

2、使用CGMutablePathRef?path =?CGPathCreateMutable();時出現(xiàn)Potential leak of an object stored into 'path’撵割,解決方案

CGPathRelease(path);

以creat,copy作為關鍵字的函數(shù)都是需要釋放內(nèi)存的贿堰,注意配對使用。比如:CGColorCreate<-->CGColorRelease

3啡彬、The 'viewWillDisappear:' instance method in UIViewController subclass?

XXX is missing a [super viewWillDisappear:] callm羹与,解決方案

- (void)viewWillAppear:(BOOL)animated {

[super?viewWillAppear:animated];

}

4、調(diào)用

+ (NSTimer?*)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable?id)userInfo repeats:(BOOL)yesOrNo;

方法之后在不需要NSTimer時及時調(diào)用[self.timer?invalidate];千萬不要在dealloc方法中調(diào)用庶灿,因為NSTimer強引用self注簿,所以不會執(zhí)行dealloc方法。

5跳仿、對象之間的循環(huán)引用:例子:兩個ViewController都需要使用對方,這個時候可以用@class ;?

說明:在 .h 中引入某個類, @class 指的是 當前文件 只是引入類名, 并沒有使用類里面的東西. 想要在 .m 里面使用 類的內(nèi)容的話, 還是要 #import <>, 這種情況跟 上面的對象之間的防止循環(huán)引 有點不一樣

6捐晶、如果是C申請的內(nèi)存菲语,注意new delete妄辩, malloc free的配對處理。

7山上、圖片相關:

緩存:imageNamed:

只需傳入文件名.擴展名即可眼耀。

可以加載bundle中任意位置的圖片,包括main bundle中其他bundle的佩憾。

imageNamed方法創(chuàng)建對象的步驟如下:

7.1根據(jù)圖片文件名在緩存池中查找圖片數(shù)據(jù)哮伟,如存在,則創(chuàng)建對象并返回妄帘;

7.2如果不存在楞黄,則從bundle中加載圖片數(shù)據(jù),創(chuàng)建對象并返回抡驼;

7.3如果相應的圖片數(shù)據(jù)不存在鬼廓,返回nil。

不緩存:imageWithContentsOfFile:

必須傳入圖片文件的全名(全路徑+文件名)致盟。

無法加載Images.xcassets中的圖片碎税。

對于大的圖片且偶爾需要顯示的應放到工程目錄下,不要放到Assets.xcassets中馏锡;并使用imageWithContentsOfFile加載不讓系統(tǒng)緩存

background.image = [UIImage imageWithContentsOfFile:[[[NSBundle mainBundle] bundlePath] stringByAppendingString:@"/*.png"]];

對于經(jīng)常需要展示的小圖片放到Assets.xcassets中讓系統(tǒng)緩存雷蹂,使用imageNamed加載

background.image = [UIImage imageNamed:@"*.png"];

不常用大圖:將imageView.image = [UIImage imageNamed:nameArr[index]];

改為imageView.image = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:nameArr[index] ofType:@"png"]];

8、出現(xiàn)VM:CG raster data杯道,SDWebImage的問題

需要在Appdelegate中設置一下

[[SDImageCache sharedImageCache] setShouldDecompressImages:NO];

[[SDWebImageDownloader sharedDownloader] setShouldDecompressImages:NO];

[[SDImageCache sharedImageCache] setShouldCacheImagesInMemory:NO];

9匪煌、VM:CoreAnimation

Found out that animation caused by the inner pages.

Inside the pageViewController(viewController that added to the scrollView as a page) on viewWillDisappear:(BOOL)animated method I added this

for (CALayer* layer in [self.view.layer sublayers]) {

? ? ? ? [layer removeAllAnimations];

}

it resolved the problem.

10、@property?(readwrite,?nonatomic,?copy)?NSMutableURLRequest?*request;出現(xiàn)Property of mutable type 'NSMutableURLRequest' has 'copy' attribute; an immutable object will be stored instead蕉饼,解決方案

@property?(readwrite,?nonatomic,?strong)?NSMutableURLRequest?*request;

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末虐杯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子昧港,更是在濱河造成了極大的恐慌擎椰,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件创肥,死亡現(xiàn)場離奇詭異达舒,居然都是意外死亡,警方通過查閱死者的電腦和手機叹侄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門巩搏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人趾代,你說我怎么就攤上這事贯底。” “怎么了撒强?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵禽捆,是天一觀的道長笙什。 經(jīng)常有香客問我,道長胚想,這世上最難降的妖魔是什么琐凭? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮浊服,結(jié)果婚禮上统屈,老公的妹妹穿的比我還像新娘。我一直安慰自己牙躺,他們只是感情好愁憔,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著述呐,像睡著了一般惩淳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上乓搬,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天思犁,我揣著相機與錄音,去河邊找鬼进肯。 笑死激蹲,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的江掩。 我是一名探鬼主播学辱,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼环形!你這毒婦竟也來了策泣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤抬吟,失蹤者是張志新(化名)和其女友劉穎萨咕,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體火本,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡危队,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了钙畔。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茫陆。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖擎析,靈堂內(nèi)的尸體忽然破棺而出簿盅,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布挪鹏,位于F島的核電站见秽,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏讨盒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一步责、第九天 我趴在偏房一處隱蔽的房頂上張望返顺。 院中可真熱鬧,春花似錦蔓肯、人聲如沸遂鹊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽秉扑。三九已至,卻和暖如春调限,著一層夾襖步出監(jiān)牢的瞬間舟陆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工耻矮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留秦躯,地道東北人。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓裆装,卻偏偏與公主長得像踱承,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子哨免,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 一. 視圖控制對象通過alloc和init來創(chuàng)建茎活,但是視圖控制對象不會在創(chuàng)建的那一刻就馬上創(chuàng)建相應的視圖,而是等到...
    iOS菜鳥攻城獅閱讀 627評論 0 7
  • 1. 用ARC管理內(nèi)存 ARC(Automatic ReferenceCounting, 自動引用計數(shù))琢唾,它避免了...
    anyurchao閱讀 2,832評論 0 16
  • 簡述: 本應釋放的內(nèi)存沒有釋放载荔,導致可用空間減少的現(xiàn)象。舉個例子:你dismiss了一個視圖控制器慧耍,但是最終卻沒有...
    iOS_肖晨閱讀 2,750評論 2 62
  • 1. 避免內(nèi)存泄漏 ① 避免對象之間循環(huán)引用(代理一定要弱引用)② block 中對象的循環(huán)引用身辨、添加的通知在銷毀...
    Install_be閱讀 190評論 0 0
  • 問題1:多個頁面無法成功dealloc,內(nèi)存沒有被釋放.界面的循環(huán)引用問題問題2:某頁面成功dealloc芍碧,但是仍...
    zhangwenqiang閱讀 253評論 0 1