Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 参考计数示例_Objective C - Fatal编程技术网

Objective c 参考计数示例

Objective c 参考计数示例,objective-c,Objective C,我试图理解Kochan Obj-C2.0书中的一个例子。看起来像这样。基本上我们有一个标准的加分数法: -(Fraction *)add:(Fraction *) f { Fraction *result = [[Fraction alloc] init]; int resultNum, resultDenom; resultNum = nermator *f.denominator + denominator*f.numerator; resultDenom = denominator *f.

我试图理解Kochan Obj-C2.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方法之前不需要alloc和initresultfraction。(问题#1)通过这样做,resultFraction现在的引用计数是否为1?或者因为它从未被分配和初始化,它的引用计数仍然是0吗

使用相同的分数类和方法,它们展示了如何计算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;
}
Fraction*aFraction=[[Fraction alloc]init];
分数*sum=[[分数分配]初始],*sum2;
inti,n,pow2;
[总和设置为:0除以:1];//将第一个分数设置为0
NSLog(@“输入n:”);
scanf(“%i”和“&n”);
pow2=2;
对于(i=1;i问题#1

您不需要alloc和init结果分数的原因是add方法为您做了这件事。(第2行)它的引用计数现在是1,因为它从未被释放。([resultFraction release];)

问题2

在本例中,确实正确的是,sum在释放后的该点上的引用计数应为0。这应该是正确的。但是,sum2仍然有效,并且您正在将其分配给sum

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

有关指针的更多信息:

问题1

您不需要alloc和init结果分数的原因是add方法为您做了这件事。(第2行)它的引用计数现在是1,因为它从未被释放。([resultFraction release];)

问题2

在本例中,确实正确的是,sum在释放后的该点上的引用计数应为0。这应该是正确的。但是,sum2仍然有效,并且您正在将其分配给sum

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


有关指针的更多信息:

Objective-C初学者通常忽略的是,变量名,如
aFraction
bFraction
只是指向一个对象,它们并不表示内存中的实际对象。
aFraction
bFraction
完全可能指向t只需将一个对象设置为另一个对象,就可以创建相同的对象


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

Objective-C初学者通常忽略的是,变量名,如
aFraction
bFraction
只是指向一个对象,它们并不代表内存中的实际对象。
aFraction
bFraction
指向同一对象,只需将一个对象设置为另一个对象即可


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

顺便说一句,您从
add:
中得到的分数应该在
add:
方法中自动释放。在这种情况下不是这样,但这显然是一个错误。关于问题2,这也是[sum2发布]的原因吗未调用?在第一个示例中,必须在最后释放resultFraction,但通过使用[sum release]释放该对象,将sum分配给sum2(两者都指向内存中的同一点),它本质上与[sum2 release]相同?sum2=[sum add:aFraction];//sum2有保留计数1,sum有保留计数1[sum release];//sum有保留计数0 sum=sum2;//sum,sum2有保留计数1对吗?再次感谢!这是正确的。如果您要执行[sum2发布]您将使sum和sum2无效,因为它们引用相同的内存。当您说:sum=sum2 sum和sum2有效地指向内存中相同的精确位置时,因此它们包含相同的精确数据。如果要取消引用并更改sum,sum2将反映这一点。顺便说一句,您从
add:
中获得的分数应该e已在
add:
方法中自动删除。本例中不是这样,但这显然是一个错误。关于问题2,这也是[sum2发布]的原因吗未调用?在第一个示例中,必须在最后释放resultFraction,但通过使用[sum release]释放该对象,将sum分配给sum2(两者都指向内存中的同一点),它本质上与[sum2 release]相同?sum2=[sum add:aFraction];//sum2有保留计数1,sum有保留计数1[sum release];//sum有保留计数0 sum=sum2;//sum,sum2有保留计数1对吗?再次感谢!这是正确的。如果您要执行[sum2发布]您将使sum和sum2无效,因为它们引用的是相同的内存。当您说:sum=sum2 sum和sum2有效地指向内存中相同的精确位置时,因此它们包含相同的精确数据。如果要取消引用并更改sum,sum2将引用