作者atst2 (atst2)
看板MacDev
标题Re: [问题] [更正]关於使用autorelease或直接使用release …
时间Sat Jul 18 12:11:19 2009
早上回的时候还没睡醒,程式有些问题...
修改一下.
※ 引述《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)