Re: [問題][更正]關於使用autorelease或直接使用release …

看板MacDev作者 (atst2)時間15年前 (2009/07/18 12:11), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
早上回的時候還沒睡醒,程式有些問題... 修改一下. ※ 引述《uranusjr (←這人是超級笨蛋)》之銘言: : 有時候是「不得不用」 : 例如你今天可能有個 getter method 需要回傳一個字串 string : 這個 string 是由一個已存在的 string1 組合成...略 Getter的情況uranusjr網友已經說明的很清楚了,補充一下Setter的做法: 一般在使用release,而非autorelease時,在setter method內應該要做一些檢查如下: //下列函式會將輸入的newString存入_myString變數中 - (void)setMyString:(NSString*)newString { if(newString && _myString != newString) {//檢查兩者指標不同 if(_myString) //_myString 有可能是nil,操作前要先檢查 [_myString release]; _myString = [newString retain]; } } 但在使用autorelease時,則語法上可以更單純一點: - (void)setMyString:(NSString*)newString { [_myString autorelease]; _myString = [newString retain]; } 差別之處,之前推文回文中都有說明了,便不再敍述。 至於何時該使用autorelease,何時使用release,個人意見是看記憶體的使用量. 一般小型軟體開發,包括學校作業,自用的小工具之類的,使用autorelease 比起使用release而言更易於管理。 不過當記憶體受限時,或是需要較多資源的軟體,對release,dealloc的時機就要 更精確的掌控. 最終一切還是由需求來決定。 補充: dealloc被呼叫的時機是reference count歸零時,並不是每次release都會呼叫. 邏輯如下: NSObject* myObject = [[NSObject alloc] init]; //ref count = 1 [myObject retain]; //ref count = 2 [myObject release]; // ref count = 1, dealloc 不會被呼叫 [myObject release]; // ref count =0, 內部自動呼叫dealloc, 釋放資源 一般在dealloc內做的事情: - (void)dealloc { if(_A) { [_A release]; //這裡要注意,要釋放object內的變數,不可以用dealloc, //更明確一點,開發者應避免直接呼叫dealloc, //而是使用release代替。 } //....釋放其他資源. [super dealloc]; } -- atst2 == atst 因為Asus的爛軟體把我的password砍掉了,現在我得用新帳號發言...= = 寫軟體的真的要嚴謹一點 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.4.234 ※ 編輯: atst2 來自: 140.112.4.234 (07/18 12:18) ※ 編輯: atst2 來自: 61.229.34.10 (07/18 17:09)
文章代碼(AID): #1AOKjePN (MacDev)