Object C 中的記憶體管理

2021-06-08 18:23:16 字數 2230 閱讀 1059

·        當你呼叫alloc/init的時候,你得到乙個引用計數是1的物件。

·        當你用完這個物件之後,你要對它呼叫release訊息,使其引用計數為0,這樣它的記憶體才會被釋放掉。

·        當你呼叫乙個方法,它不是以init或者copy開頭的,這時,返回給你的物件是autorelease的,它是一種在將來某個時刻會自動被釋放的物件。(這裡我也要提醒大家一句,比如你在寫乙個函式,它的名字是***,沒有以init或者copy開頭,那麼記得你返回的物件一定要是autorelease的,否則,別人在使用你這個函式的時候就會把它當前是autorelease的,那麼他就不會release它,這樣就會造成記憶體洩漏,千萬要切記!!!)

·        如果你想繼續使用autorelease物件,那麼你就要給它放送乙個retain訊息。

·        如果你使用alloc/init方法建立了乙個物件,但是你想讓它自己在出了runloop之後被自動釋放的話,那麼你可以在alloc/init之後再呼叫autorelease。這也是一種見得比較多的寫法了。比如,cocos2d裡面呼叫[*** node]的時候,就等於[[[*** alloc] init]autorelease].

-(void)tableview:(uitableview *)tableview didselectrowatindexpath:(nsindexpath*)indexpath {

nsstring * sushiname = [_su****ypesobjectatindex:indexpath.row]; // 1

nsstring * sushistring = [nsstringstringwithformat:@"%d: %@",

indexpath.row, sushiname]; // 2

nsstring * message = [nsstringstringwithformat:@"last sushi: %@. cur sushi: %@", _lastsushiselected, sushistring]; // 3

uialertview *alertview = [[[uialertviewalloc] initwithtitle:@"sushi power!"

message:message

delegate:nil

cancelbuttontitle:nil

otherbuttontitles:@"ok", nil] autorelease]; // 4

[alertview show]; // 5

[_lastsushiselected release]; // 6

_lastsushiselected = [sushistring retain];// 7

這裡的**比較多,讓我們一行一行來看:

1.   查詢當前行對應的sh****ypes陣列裡面的字串。

2.   根據當前行號構建乙個新的字串。注意,這裡使用的是stringwithformat方法,它返回的是乙個autorelease的字串。因為這個方法並不是以init或者copy開頭,所以你就知道。記住,這意味著,你可以在這個函式裡面使用此字串,但是出了這個函式的話,如果你還想繼續使用之,那必須要對它傳送乙個retain訊息。

3.   構建乙個訊息,用來顯示當前選中的sushi和最後選中的sushi。和上面一樣,這裡也是使用的stringwithformat方法,它返回的是乙個autorelease物件。因為我們只想在這個函式裡面使用,所以沒有retain。

4.   建立乙個alertview來顯示剛剛構建的那個訊息。這裡是通過alloc/init方式建立的,所以我們需要在之後再傳送乙個autorelease訊息,這樣在出了這個函式以後,這個物件就會被釋放掉了。

5.   顯示這個alert view。

6.   再你設定lastsushiselected例項變數之前,你需要先釋放當前的lastsushiselected例項變數,如果當前例項變是已經是nil的話,也沒有關係,因上nil物件可以接收任何訊息。

7.   因為你想在這個函式之外再使用lastsushiselected這個字串,所以你需要retain它。

還有一件事你不能忘記。為了儲存不會有任何記憶體洩漏,你需要在rootviewcontroller的dealloc方法裡面呼叫下面方法來釋放記憶體:

[_lastsushiselectedrelease];

_lastsushiselected= nil;

基本上,在dealloc方法被裡面,你需要對「你負責的物件」傳送release訊息,並且要把它賦值為nil。

Object C中管理記憶體

object c之中採用一種保留記錄的方式記錄我們所建立的所有的物件,並且,當該計數減少為0的時候,object c自動收回分配給乙個物件的記憶體。text text1 text alloc init text text2 text alloc init 每乙個物件的計數都為1,我們可以通過reta...

Object c記憶體管理

記憶體管理 物件的生命週期包括以下幾個時期 物件初始化 物件接收訊息和執行操作 物件被釋放 判斷乙個物件是否結束,用到引用計數器 引用計數器的基本概念 1 每個人物件有乙個整數值,這個整數值與物件本身關聯,稱為引用計數器 2 當某些地方需要使用這個物件時,可以將引用計數器加1,表示使用這個這個物件 ...

Object C 記憶體管理

object c 記憶體管理 一 基本概念 1.iphone系統中的objective c的記憶體管理機制是比較靈活的,即可以拿來像c c 一樣用,也可以加個autoreleasepool讓它公升級為半自動化的記憶體管理語言 2.引用計數是例項物件的記憶體 唯一參考 引用計數 retaincount...