延時呼叫的時候要注意

2021-06-08 19:38:18 字數 1742 閱讀 3303

前幾天在給遊戲做收尾測試時,發現了乙個關於記憶體洩露的問題,一直沒找著問題所在,經過反覆除錯和查詢資料今天終於解決了,特此記錄下來以免以後再犯!

關於objective-c的記憶體管理,我們都知道乙個原則就是「誰建立,誰釋放」,換句話說,不是我們建立的,就不用我們去釋放。但是實際上objective-c的記憶體管理遠遠沒那麼簡單,我的情況是這樣的:

我在debug模式下面用cclog在dealloc函式裡面輸出一些資訊,目的就是要檢查場景的dealloc方法在replacescene的時候有沒有被呼叫,按照子龍山人大哥的說法,如果場景切換的時候dealloc沒有呼叫,說明你這個場景的記憶體有問題。有可能被某個物件retain了,其retaincount在replacescene的時候沒有減少到0,所以dealloc方法是不會呼叫的。如果dealloc方法都沒有調掉,那麼這其實就是一種記憶體洩露。我在檢查時,發現乙個場景死活不呼叫dealloc,最後恨不得把所有的遊戲邏輯都移除了,還是不走dealloc。

最後的最後才發現實際上是performselector延時呼叫的問題,經查詢資料,performselector關於記憶體管理的執行原理是這樣的執行 [self performselector:@selector(method1:) withobject:self.tablelayer afterdelay:3]; 的時候,系統會將tablelayer的引用計數加1,執行完這個方法時,還會將tablelayer的引用計數減1,而在我的遊戲裡這個延時執行函式是被多次呼叫的,有時切換場景時延時函式已經被呼叫但還沒有執行,這時tablelayer的引用計數沒有減少到0,也就導致了切換場景dealloc方法沒有被呼叫,出現了記憶體洩露。

所以最後我的解決辦法就是取消那些還沒有來得及執行的延時函式,**很簡單:

[nsobject cancelpreviousperformrequestswithtarget:self]

當然你也可以乙個乙個得這樣用:

[nsobject cancelpreviousperformrequestswithtarget:self selector:@selector(method1:) object:nil]

加上了這個以後,切換場景也就很順利地執行了dealloc方法,至此問題解決!

最後在找資料時也發現了,延時呼叫實現長按鈕的實現思路,記錄下來以備後用:

在touchbegan裡面

[self performselector:@selector(longpressmethod:) withobject:nil afterdelay:longpresstime]

然後在end 或

cancel裡做判斷,如果時間不夠長按的時間呼叫:

[nsobject cancelpreviousperformrequestswithtarget:self selector:@selector(longpressmethod:) object:nil]

取消began裡的方法

最後最後總結:

performselector是乙個很有用的函式,跟它打過不少交道,經過血與淚的教訓,總結一下它的使用如下:

使用前先檢測一下,

sel testselector = @selector(test:);   

if([tester respondstoselector:testselector])  

使用後,如果有必要,需要顯示的呼叫cancelpreviousperformrequestswithtarget:selector:object: ,否則有可能產生記憶體洩露,而且這種記憶體洩露很難發現,因為它並不違反任何規則,所以一定要注意!

企業在建站的時候需要注意的

在建站前,首先我們要做的就是確定 的作用定位,只有了解了 的作用定位,才能更合理地建設 比如你希望建立什麼型別的 的主要作用等。企業 的功能分為形象展示 內部網路管理 電子商務三大模組。設計好首頁排版和形象 的首頁是 主題內容和形象的結合,是給瀏覽者第一印象的關鍵點。所以我們要合理設計好 的首頁,考...

在使用GROUP BY 時候需要注意的地方

在開發過程中常常會遇到sql 進行分組的業務,筆者在編碼過程中就犯了這樣乙個低階錯誤,還好專案經理及時指出來了,避免了以後的問題,給大家分享一下。使用explain 可以看到執行計畫,看到extra列中有using filesort,這是對效能有一定影響的,特別是使用了group by時,就算你沒有...

新手買樹莓派的時候要注意什麼

買電子產品基本有這樣乙個定律,如果沒有特殊需求就不要買 2以上的東西,最多帶個殼 貼膜之類的就可以了,看似東西多沒加多少錢,實際上送的一般質量很一般,而且實用性不強,成本也低,還是根據自己的需要購買比較划算。買樹梅派的話,能正常執行的必要物件有 一 主機,這裡推薦買最 4b,電子產品買新不買舊,記憶...