作者uranusjr (←这人是超级笨蛋)
看板MacDev
标题Re: [问题] 关於使用autorelease或直接使用release …
时间Sat Jul 18 12:20:24 2009
※ 引述《atst2 (atst2)》之铭言:
: ※ 引述《uranusjr (←这人是超级笨蛋)》之铭言:
: : 有时候是「不得不用」
: : 例如你今天可能有个 getter method 需要回传一个字串 string
: : 这个 string 是由一个已存在的 string1 组合成...略
: Getter的情况uranusjr网友已经说明的很清楚了,补充一下Setter的做法:
: 一般在使用release,而非autorelease时,在setter method内应该要做一些检查如下:
: //下列函式会将输入的newString存入_myString变数中
: - (void)setMyString:(NSString*)newString
: {
: if(newString && _myString != newString) {//检查两者指标不同
: [_myString release];
: _myString = [newString retain];
: }
: }
: 但在使用autorelease时,则语法上可以更单纯一点:
: - (void)setMyString:(NSString*)newString
: {
: [_myString autorelease];
: _myString = [newString retain];
: }
这边还有一种写法
- (void)setMyString:(NSString *)newString
{
[newString retain];
[_myString release];
_myString = newString;
}
先 retain 新的再 release 旧的就不会有问题
至於要用哪种就可以视状况而定
如果 setter 被呼叫时常常其实新旧值根本一样, 那用检查法或 autorelease 比较好
反之如果 setter 常常要处理新值, 那 retain - release 法就比较好
检查法和 autorelease 法的差别当然就在前者多一个 if
而後者的 _myString 废料会占用记忆体比较久
: 差别之处,之前推文回文中都有说明了,便不再敍述。
: 至於何时该使用autorelease,何时使用release,个人意见是看记忆体的使用量.
: 一般小型软体开发,包括学校作业,自用的小工具之类的,使用autorelease
: 比起使用release而言更易於管理。
小型软体开发当然用 garbage colletor 比较好(喂)
当然写 iPhone 软体开发的请忽视这一行XD
: 不过当记忆体受限时,或是需要较多资源的软体,对release,dealloc的时机就要
: 更精确的掌控.
: 最终一切还是由需求来决定。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.135.72.123