自動釋放池什麼時候建立,什麼時候銷毀?

2021-07-15 15:15:15 字數 1043 閱讀 3336

自動釋放池什麼時候建立,什麼時候銷毀?

執行迴圈結束前會釋放自動釋放池,還有就是池子滿了,也會銷毀。

面試題

下面**存在記憶體問題麼?如果存在如何解決?為什麼

-(void)touchesbegan:(nsset *)touches withevent:(uievent *)event 

}

解題思路:首先根據類方法建立的,而且他們都用的是類方法,類方法是每次呼叫,每次都會為你建立乙個新的物件。還有就是通過物件方法建立的物件,如果不是通過alloc new retain copy 建立的物件,那麼他們內部都有乙個autorelease.(可以通過nslog(@」%p」,str),檢視每次呼叫過後的記憶體位址,他們的記憶體位址是不一樣的),他們都是通過自動釋放池進行自動釋放的,所以這些字串物件會等到迴圈結束時才會進行釋放,而此時它們會消耗大量的記憶體資源,所以她們存在記憶體問題。---通過xcode檢視記憶體峰值就可以看出執行時的變化

解決辦法:從題中看出每次迴圈這個物件就不會再呼叫了,所以,我們可以將每一次迴圈放入到自動釋放池中去,這樣每次迴圈結束後變會將此次建立的物件銷毀,如下**

-(void)touchesbegan:(nsset *)touches withevent:(uievent *)event 

}}

——考慮到lagernum這個資料足夠大,所以我們在內部建立自動釋放池,如果lagernum不足夠大,那麼我們可以在for迴圈外面建立自動釋放池。

預設主線的執行迴圈(runloop)是開啟的,子執行緒的執行迴圈(runloop)預設是不開啟的,也就意味著子執行緒中不會建立autoreleasepool,所以需要我們自己在子執行緒中建立乙個自動釋放池。(子執行緒裡面使用的類方法都是autorelease,就會沒有池子可釋放,也就意味著後面沒有辦法進行釋放,造成記憶體洩漏。)—-在主線程中如果產生事件那麼runloop才回去建立autoreleasepool,通過這個道理我們就知道為什麼子執行緒中不會建立自動釋放池了,因為子執行緒的runloop預設是關閉的,所以他不會自動建立autoreleasepool,需要我們手動新增

autorelease 什麼時候釋放

在iphone專案中,大家會看到乙個預設的autorelease pool,程式開始時建立,程式退出時銷毀,按照對autorelease的理解,豈不是所有autorelease pool裡的物件在程式退出時才release,這樣跟記憶體洩露有什麼區別?答案是,對於每乙個runloop,系統會隱式建立...

autorelease 什麼時候釋放

在iphone專案中,大家會看到乙個預設的autorelease pool,程式開始時建立,程式退出時銷毀,按照對autorelease的理解,豈不是所有autorelease pool裡的物件在程式退出時才release,這樣跟記憶體洩露有什麼區別?答案是,對於每乙個runloop,系統會隱式建立...

什麼時候用exists 什麼時候用in

in not in exists not exists 使用exists,oracle會首先檢查主查詢,然後執行子查詢直到它找到第乙個匹配項,這就節省了時間。oracle在執行in子查詢時,首先執行 子查詢,並將獲得的結果列表存放在乙個加了索引的臨時表中。在執行子查詢之前,系統先將主查詢掛起 待子查...