所以我正在研究Objective c 2.0中的编程,我正在研究一种从另一个中减去1个分数对象的方法,我有算法和所有设置并且它确实有效,但是在进行过程中(调试) )我发现,即使我将分数复制到新的实例中,所以我不会弄乱原始值,分子和分母的值仍在变化,以反映现在分配给“工作副本”的值
不确定我是否遗漏了某些内容,我们将不胜感激任何帮助或见解,(并非真正寻找有关算法或我的草率内存管理的反馈)
谢谢,
尼克
哦,是的,这是实施代码:
#import "Fraction.h"
@implementation Fraction
@synthesize numerator, denominator;
-(void) print
{
NSLog (@"%i/%i", numerator, denominator);
}
-(void) setTo: (int) n over: (int) d
{
numerator = n;
denominator = d;
}
-(double) convertToNum
{
if (denominator != 0)
return (double) numerator / denominator;
else
return 1.0;
}
- (void) add: (Fraction *) f
{
// To add two fractions:
// a/b + c/d = ((a*d) + (b*c)) / (b * d)
numerator = numerator * f.denominator
+ denominator * f.numerator;
denominator = denominator * f.denominator;
[self reduce];
}
- (Fraction *) subtract: (Fraction *) f
{
int x = denominator;
int xhold = denominator;
int y = [f denominator];
int yHold = [f denominator];
int temp1 = 1, temp2 = 0 , temp3 = 0, co1 = 1;
Fraction *resultFraction = [[Fraction alloc] init];
Fraction *xFraction = [[Fraction alloc] init];
Fraction *yFraction = [[Fraction alloc] init];
xFraction = self;
yFraction = f;
if ( x > y )
{
for (co1 = 1 ; temp1 != 0; co1++)
{
temp1 = x % y;
if (temp1 == 0)
{
temp2 = x / y;
temp3 = y * temp2;
[yFraction setDenominator: temp3];
[yFraction setNumerator: [yFraction numerator] * temp2];
[xFraction setNumerator: [xFraction numerator] * co1];
[xFraction setDenominator:[xFraction denominator] * co1];
}
else if (temp1 !=0)
x = xhold * co1;
}
[xFraction setNumerator : [ xFraction numerator] - [yFraction numerator] ];
[xFraction reduce];
}
else if ( y > x )
{
for (co1 = 1 ; temp1 != 0; co1++)
{
temp1 = y % x;
if (temp1 == 0)
{
temp2 = y / x;
temp3 = x * temp2;
[yFraction setNumerator: [yFraction numerator] * co1];
[yFraction setDenominator: [yFraction denominator] * co1];
[xFraction setNumerator: [xFraction numerator] * temp2];
[xFraction setDenominator: temp3 ];
}
else if (temp1 !=0)
y = yHold * co1 ;
}
[xFraction setNumerator : [xFraction numerator] - [ yFraction numerator]];
resultFraction = xFraction;
[resultFraction reduce];
}
else if (x == y)
{
[xFraction setNumerator: [xFraction numerator] - [ yFraction numerator]];
resultFraction = xFraction;
[resultFraction reduce];
}
return resultFraction;
}
- (void) reduce
{
int u = numerator;
int v = denominator;
int temp;
while (v != 0) {
temp = u % v;
u = v;
v = temp;
}
numerator /= u;
denominator /= u;
}
- (Fraction *) multiply : (Fraction *) f;
{
Fraction *xFraction = [[Fraction alloc] init];
Fraction *yFraction = [[Fraction alloc] init];
Fraction *resultFraction = [[Fraction alloc] init];
xFraction = self;
yFraction = f;
resultFraction = self;
[resultFraction setNumerator: [xFraction numerator] * [yFraction numerator]];
[resultFraction setDenominator: [xFraction denominator] * [yFraction denominator]];
[resultFraction reduce];
return resultFraction;
}
@end
答案 0 :(得分:3)
你的-subtract:方法包含以下代码:
Fraction *resultFraction = [[Fraction alloc] init];
Fraction *xFraction = [[Fraction alloc] init];
Fraction *yFraction = [[Fraction alloc] init];
xFraction = self;
yFraction = f;
最后两行不会将self
和f
中的值复制到新实例上,它们只会复制指针(实际上会丢失/泄漏新分配的实例)。在最后两行xFraction
指向与self
相同的对象后,yFraction
指向与f
相同的对象。
由于它看起来不像您正在实现NSCopying协议,因此您必须通过复制原始实例中的值来初始化新实例。我还没有真正看过你的算法,但你可能会尝试这个(而不是最后两个分配):
[xFraction setTo:numerator over:denominator];
[yFraction setTo:[f numerator] over:[f denominator]];