Re: [問題][更正]關於使用autorelease或直接使用release …
早上回的時候還沒睡醒,程式有些問題...
修改一下.
※ 引述《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)