不使用ARC或自动垃圾收集
-(Fraction*) add: (Fraction*) f
{
Fraction *result = [[Fraction alloc] init];
//To do
return result;
}
//after the function returns. What will the reference count
of object that result was pointing to. See main.m below.
IN main.m
int main(int argc, char* argv[])
{
//To do
Fraction *ans = [[Fraction alloc] init];
ans = [f1 add: f2];
//I guess that the refrence count of the object that ans will be pointing
after this statement will be 1 or 2.
//...
}
//来自stephen kochan objective-c
的摘录使用手动内存管理时,此方法存在问题。在执行计算之后,对方法进行分配和返回。因为该方法必须返回该对象,所以它无法释放它 - 这会导致它在那时被销毁。解决此问题的最佳方法可能是自动释放对象,以便可以返回其值,并将其释放延迟直到自动释放池耗尽。您可以利用autorelease方法返回其接收器并将其嵌入到以下表达式中这一事实:
Fraction *result = [[[Fraction alloc] init] autorelease];
//or like this:
return [result autorelease];
注意:根据提取,似乎参考计数为2.如果是这样,请解释原因?
答案 0 :(得分:0)
//答案不承担任何电弧和自动垃圾收集
添加功能:
创建了一个分数类的瞬间,对它的引用存储在result
中。由于alloc and init
用于创建即时result
成为其所有者。并且只有所有者必须在完成使用时释放它拥有的对象。但是,result
不会释放它(See add)
。现在,add返回对result
所拥有的对象的引用,并将其存储在ans
main.m
中。因为,ans不是它引用的对象的所有者,并且没有尝试获取,所以对象的引用计数将为1.因为,此对象的所有者不能再被引用所以,我们不能发布它。 (Blah!内存泄漏)。
但是如果我们[ans release]
怎么办?虽然这是不好的做法。它可以节省内存泄漏...
我想是的。请评论是否不会