iOS 關於記憶體洩露的想法

2021-09-11 16:39:59 字數 2389 閱讀 4683

當實習生的時候才第一次考慮記憶體洩漏的問題,當時做的也很簡單,無非就是幾個步驟:

1.注意對self等的弱化指標的宣告方法,**使用weak,而block使用copy。 2.釋放該類中的nsnotification(通知)、nstimer(定時器)等 3.在該類的dealloc中列印,通過哪些類沒有列印結果檢視是出問題的類。

最近又對記憶體洩露有了一些新的了解,關於以上的幾點有一些更好的做法:

關於self的弱化方式有好幾種方式:

__weak __typeof(self) weakself = self;

__weak __typeof(&*self) weakself = self;

__weak uiviewcontroller *weakself =self;

複製**

很簡單,一般會直接放在乙個全域性的檔案中公用:

#define ws(ws)  __weak __typeof(&*self)ws = self;

複製**

在block中使用例項變數時,也會引起記憶體洩露的警告,所以最好將要在block中使用的物件宣告為屬性。 如:使用下方的方法宣告的bottomdetailcollectionview是乙個強指標,如果在block中使用的話,會導致迴圈。

lzbottomdetailcollectionview *bottomdetailcollectionview = [[lzbottomdetailcollectionview alloc] init];

self.bottomdetailcollectionview = bottomdetailcollectionview;

[self.view addsubview:bottomdetailcollectionview];

ws(ws)

toptitlecollectionview.toptitleselected = ^(nsinteger tag) ;

複製**

應該將block中的bottomdetailcollectionview改為弱引用的ws.bottomdetailcollectionview。

剛開始學的時候,只知道nstimer在呼叫方法:

[nstimer scheduledtimerwithtimeinterval:1 target:self selector:@selector(dosomething) userinfo:nil repeats:yes];

複製**

[self.timer invalidate];

self.timer = nil;

複製**

但是很容易忘記寫這些方法,所以參考yyimage中的方法進行修改:

① 建立乙個繼承與nsproxy的子類

@inte***ce lzweekproxy : nsproxy

@property (nonatomic, weak, readonly) id target;

-(instancetype)initwithtarget:(id)target;

+(instancetype)proxywithtarget:(id)target;

@end

@implementation lzweekproxy

-(instancetype)initwithtarget:(id)target

+(instancetype)proxywithtarget:(id)target

- (id)forwardingtargetforselector:(sel)selector

@end

複製**

對於為什麼要繼承於nsproxy,我的理解是: nsproxy類似於nsobject,是乙個基類。其次nsproxy是乙個虛類,基本上只是關於訊息**的方法,而需要的類其中乙個目的就是將訊息**回target目標物件中的方法實現。

① 建立nstimer

self.timer = [nstimer scheduledtimerwithtimeinterval:1 target:[lzweekproxy proxywithtarget:self] selector:@selector(dosomething) userinfo:nil repeats:yes];

複製**

在建立nstimer時,不再對self強引用。即便沒有呼叫系統的方法,也不會引起記憶體洩露的情況。

一開始的時候確實傻乎乎的通過dealloc方法是否列印的方式判斷,網路上確實有一些已經很使用的工具,通過追蹤該物件的引用計數方式進行判斷。當然任何工具都會有一定的偏差,在實際的開發中還是需要一定的判斷力:

2.pleaksniffer

在開發中難免會出現記憶體洩露的情況,所以一定要多加注意

關於記憶體洩露

1.只要分配了記憶體沒有釋放,就會導致記憶體洩漏 這是我以前的理解,是片面的.分配了的記憶體,如果它的指標沒有丟失,就不算是洩漏.一般說來,為static指標變數或全域性的指標變數 它們的生存期是全域性的 進行記憶體分配,如果沒有釋放它,雖然這也是 not freed blocks 但是它是 rea...

iOS 記憶體洩露問題

記憶體洩露 1.如果在 非arc 下面三行 就出現的記憶體洩露 person person1 person alloc init person person2 person alloc init person1 person2 person1 person2 位址不一樣,這樣把person1指標指向...

關於 ThreadLocal 記憶體洩露

在使用 threadlocal 的時候,一般我們的 都是這樣寫的 public class threadlocaldemo public static long getuserid public static void remove 然後處理業務的是乙個執行緒池,有乙個結果就是 threadloca...