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