为什么我的方法会覆盖自我值并传递参数,即使我将它们复制到新实例中?

时间:2010-01-02 23:40:33

标签: objective-c debugging object

所以我正在研究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

1 个答案:

答案 0 :(得分:3)

你的-subtract:方法包含以下代码:

Fraction *resultFraction = [[Fraction alloc] init]; 
Fraction *xFraction = [[Fraction alloc] init];
Fraction *yFraction = [[Fraction alloc] init];

xFraction = self;
yFraction = f;

最后两行不会将selff中的值复制到新实例上,它们只会复制指针(实际上会丢失/泄漏新分配的实例)。在最后两行xFraction指向与self相同的对象后,yFraction指向与f相同的对象。

由于它看起来不像您正在实现NSCopying协议,因此您必须通过复制原始实例中的值来初始化新实例。我还没有真正看过你的算法,但你可能会尝试这个(而不是最后两个分配):

[xFraction setTo:numerator over:denominator];
[yFraction setTo:[f numerator] over:[f denominator]];