NSTimer 和 NSArray 同時使用的問題

2021-09-30 15:23:36 字數 1821 閱讀 7085

我宣告乙個全域性變數nsarray存放動畫所需要各幀,然後用nstimer進行定時動畫顯示,如下:

myimages = [nsarray arraywithobjects:

[uiimage imagenamed:@"frame_1.png"],

[uiimage imagenamed:@"frame_2.png"],

[uiimage imagenamed:@"frame_3.png"],

[uiimage imagenamed:@"frame_4.png"],,nil];

但是出現了乙個訪問錯誤:

access nsarray from a nstimer interval = exc_bad_access

找原因,發現nsarray* myimages 使用 arraywithobjects宣告是autorelease的,而autorelease 會自動釋放,所以再使用動畫的時候會出現訪問錯誤,

問題是,autorelease是在什麼時候release呢,?

如果你能夠真正的理解autorelease,那麼你才是理解了objective c的記憶體管理。autorelease實際上只是把對release的呼叫延遲了,對於每乙個autorelease,系統只是把該object放入了當前的autorelease pool中,當該pool被釋放時,該pool中的所有object會被呼叫release。

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

答案是,對於每乙個runloop, 系統會隱式建立乙個autorelease pool,這樣所有的release pool會構成乙個象callstack一樣的乙個棧式結構,在每乙個runloop結束時,當前棧頂的autorelease pool會被銷毀,這樣這個pool裡的每個object會被release。

那什麼是乙個runloop呢? 乙個ui事件,timer call, delegate call, 都會是乙個新的runloop。例子如下:

nsstring*globalobject; 

-(void -(

void

-(ibaction)onbuttonclicked

[2]為什麼需要auto release ?

2.1)很多c/c++轉過來的程式設計師會說,這個auto release有什麼好,象c/c++那樣,自己申請,自己釋放,完全可控不好麼, 這個auto relase 完全不可控,你都不知到它什麼時候會被真正的release。我的理解它有乙個作用就是可以做到每個函式對自己申請的物件負責,自己申請,自己釋放,該函式的呼叫者不需要關心它內部申請物件的管理。 在下面這個例子中,func1的呼叫者不需要再去關心obj的釋放。

classa*func1() 

實際上對於 [nsstring stringwithformat:] 這類建構函式返回的物件都是autorelease的。

2.2) autorelease pool來避免頻繁申請/釋放記憶體(就是pool的作用了)。這個應該是相對比較好理解的。

總結:1)一定要注意autorelease pool的生存週期,理解runloop,避免在物件被釋放後使用。

2)[nsstring stringwithformat:]這類函式返回的物件是不需要再自己release的,它已經被autorelease了, 如果你想把它當乙個全域性物件使用,那必須自己再retain, 釋放時再release。

NSTimer和CADisplayLink的用法

nstimer初始化器接受呼叫方法邏輯之間的間隔作為它的其中乙個引數,預設一秒執行30次。cadisplaylink預設每秒執行60次,通過它的frameinterval屬性改變每秒執行幀數,如設定為2,意味cadisplaylink每隔一幀執行一次,有效的邏輯每秒執行30次。此外,nstimer接...

NSTimer和CADisplayLink的用法

nstimer初始化器接受呼叫方法邏輯之間的間隔作為它的其中乙個引數,預設一秒執行30次。cadisplaylink預設每秒執行60次,通過它的frameinterval屬性改變每秒執行幀數,如設定為2,意味cadisplaylink每隔一幀執行一次,有效的邏輯每秒執行30次。此外,nstimer接...

NSSet和NSArray的對比

1 共同點 都是集合,都能存放多個oc物件 只能存放oc物件,不能存放非oc物件型別 基本資料型別 int char float等,結構體,列舉 本身都不可變,都有乙個可變的子類 2 不同點 nsarray有順序,nsset沒有順序 集合 nsset 是一種雜湊表,運用雜湊演算法,查詢集合中的元素比...