制作一个不可变的课:我做错了什么?

时间:2012-04-21 02:37:15

标签: objective-c

我正在尝试创建一个不可变的类。没有进一步的麻烦:

#import "MatrixRow2.h"

@implementation MatrixRow2

@synthesize rows;

-(MatrixRow2*) initWithFractionNumberArray:(NSArray*)array
{
    if (self = [super init]) {
        rows = array;
    }

    return self;
}

-(MatrixRow2*) rowByMultiplyingByFractionNumber:(FractionNumber*)number
{
    NSArray *temp = rows.copy;
    MatrixRow2 *newRow = [[MatrixRow2 alloc] initWithFractionNumberArray:temp];

    for (int i=0; i < newRow.rows.count; i++) {
        [[newRow.rows objectAtIndex:i] multiplyByFraction:number];
    }

    return newRow;
}

-(NSString*) description
{
    return [rows description];
}

@end

测试人员代码:

MatrixRow2 *r = [[MatrixRow2 alloc] initWithFractionNumberArray:tempRow];

NSLog(@"Initial row values: %@", r);

FractionNumber *randomMultiplier = [FractionNumber fractionFromRandomFractionWithMaxNumerator:100 maxDenominator:99 integerChanceIn10:8];

MatrixRow2 *r2= [r rowByMultiplyingByFractionNumber:randomMultiplier];

NSLog(@"%@ * %@ = %@", r, randomMultiplier, r2);

输出是:

2012-04-20 22:33:29.081 RREF[3586:f803] Initial row values: (
    70,
    94,
    98,
    90
)
2012-04-20 22:33:29.083 RREF[3586:f803] (
    770,
    1034,
    1078,
    990
) * 11 = (
    770,
    1034,
    1078,
    990
)

在第二个输出行中,r的值已更改为相乘的值。它应该是:

[70 94 98, 90] * 11 = [770 1034 1078 990]

1 个答案:

答案 0 :(得分:2)

你正在做一个数组的浅表副本。在变异之前,您需要复制数组中的每个项目。

这将涉及创建每个项目的副本并将其添加到新数组(或使用每个项目的副本更新复制数组中的项目)。

不可变对象使用的所有内容都需要在变异之前进行不可变或复制。