內(nèi)存泄露和循環(huán)引用問題
開發(fā)項目時你怎么檢查內(nèi)存泄漏
- 靜態(tài)分析analyze
- instruments里有一個leak工具可以動態(tài)分析
- 如果block中多次使用weakSelf的話,可以在block中先使用strongSelf,防止block執(zhí)行時weakself被自動釋放
- 對于非ARC,將weak改用為block即可
常見的出現(xiàn)循環(huán)引用的場景有哪些
- 定時器(NSTimer):NSTimer經(jīng)常會被作為某個類的成員變量,而NSTimer在初始化時又要指定self為target,容易造成循環(huán)引用。另外,若timer一直處于validate的狀態(tài),則其引用計數(shù)將始終大于0,因此在NSTimer使用完畢之后,應(yīng)該先調(diào)用invalidate方法,而且在定義NSTimer屬性的時候要使用weak修飾符。
- block:block在copy時會對block內(nèi)部用到的對象進(jìn)行強(qiáng)引用(ARC中訪問到外部變量會把變量copy到堆中)或者引用計數(shù)+1(非ARC)。一般表現(xiàn)為,某個類將block作為自己的屬性變量,然后該類在block的方法體里面又使用了該類本身。解決辦法:
__weak __typeof__ (self) wself = self;
- 代理:規(guī)避代理循環(huán)引用的方法:聲明delegate屬性的時候用assign(MRC)或weak(ARC)