我试图理解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问题抱歉。
答案 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初学者通常忽略的是,您的变量名称(例如aFraction
和bFraction
只是指向到对象,它们并不代表实际记忆中的物体。 aFraction
和bFraction
完全可以指向同一个对象,只需将其设置为另一个即可。
在开始时,resultFraction
变量已声明但尚未设置为指向任何内容。当您在add:
对象上调用aFraction
方法时,该方法返回一个新分配的对象(包含添加的结果),resultFraction
变量现在指向该新对象