参考计数示例

时间:2010-01-07 19:42:25

标签: objective-c

我试图理解Kochan Obj-C 2.0书中的一个例子。看起来像这样。基本上我们有一个标准的添加分数方法:

-(Fraction *)add:(Fraction *) f {
Fraction *result = [[Fraction alloc] init];
int resultNum, resultDenom;
resultNum = nermator *f.denominator + denominator*f.numerator;
resultDenom = denominator *f.denominator
// numerator and denominator are instance variables 
[result setTo: restultNum over: resultDenom]; // another method that sets the fraction (e.g. 1/4)
[result reduce];
return result}

有两个使用它的例子,我不明白,一个在main.m测试文件中,他们这样做:

Fraction *aFraction = [[Fraction alloc] init];
Fraction *bFraction = [[Fraction alloc] init];
Fraction *resultFraction;

[aFraction setTo: 1 over: 4];
[bFraction setTo: 1 over: 2];

resultFraction = [aFraction add: bFraction];

我不明白为什么在使用add方法之前不需要分配和初始化resultFraction。 (问题#1)另外,通过这样做,resultFraction现在的引用计数是1吗?或者因为它从未被分配和初始化,它的引用计数是否仍为0?

使用相同的Fraction类和方法,它们显示了如何计算1/2 ^ n总和的示例

以下是代码:

Fraction *aFraction = [[Fraction alloc] init];
Fraction *sum = [[Fraction alloc] init], *sum2;
int i, n, pow2;

[sum setTo: 0 over:1]; // set 1st fraction to 0

NSLog(@"Enter n:");
scanf("%i", &n);

pow2 = 2;
for (i = 1; i <=n; ++i) {
[aFraction setTo: 1 over: pow2];
sum2 = [sum add: aFraction];
[sum release];
sum = sum2;
pow2 *=2;
}

在此示例中,sum为alloc'd和init'd,并添加到aFraction,结果分配给sum2,然后释放sum。那么它是如何在下一行(sum = sum2)中,sum仍然保持该值?因为它只被初始化一次,因此在释放后引用的引用数量为0。我认为sum2会增加引用计数,并且在分配给sum之后需要重新计算。

对于noob问题抱歉。

2 个答案:

答案 0 :(得分:4)

问题#1

您不需要分配和初始化结果分数的原因是因为add方法为您执行此操作。 (第2行)它的引用计数现在是一个,因为它从未发布过。 ([resultFraction release];)

问题#2

在这个例子中,你确实是正确的,在释放之后,sum的引用计数应该为0。这应该没问题。但是,sum2仍然有效,你将其分配给总和。

这是简单的指针赋值。 sum是一个指针,它只是查看一块内存。当释放该块内存时,最终将收集它。 sum = sum2的赋值只是将sum2表示的对象的位置复制为sum。

有关指针的更多信息:http://www.informit.com/articles/article.aspx?p=1272497&seqNum=2

答案 1 :(得分:1)

Objective-C初学者通常忽略的是,您的变量名称(例如aFractionbFraction只是指向到对象,它们并不代表实际记忆中的物体。 aFractionbFraction完全可以指向同一个对象,只需将其设置为另一个即可。

在开始时,resultFraction变量已声明但尚未设置为指向任何内容。当您在add:对象上调用aFraction方法时,该方法返回一个新分配的对象(包含添加的结果),resultFraction变量现在指向该新对象