Objective C中关于引用计数的内存管理

时间:2013-09-23 03:18:24

标签: objective-c memory-management

不使用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.如果是这样,请解释原因?

1 个答案:

答案 0 :(得分:0)

//答案不承担任何电弧和自动垃圾收集

添加功能: 创建了一个分数类的瞬间,对它的引用存储在result中。由于alloc and init用于创建即时result成为其所有者。并且只有所有者必须在完成使用时释放它拥有的对象。但是,result不会释放它(See add)。现在,add返回对result所拥有的对象的引用,并将其存储在ans main.m中。因为,ans不是它引用的对象的所有者,并且没有尝试获取,所以对象的引用计数将为1.因为,此对象的所有者不能再被引用所以,我们不能发布它。 (Blah!内存泄漏)。
但是如果我们[ans release]怎么办?虽然这是不好的做法。它可以节省内存泄漏...
我想是的。请评论是否不会