我正在尝试创建一个不可变的类。没有进一步的麻烦:
#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]
答案 0 :(得分:2)
你正在做一个数组的浅表副本。在变异之前,您需要复制数组中的每个项目。
这将涉及创建每个项目的副本并将其添加到新数组(或使用每个项目的副本更新复制数组中的项目)。
不可变对象使用的所有内容都需要在变异之前进行不可变或复制。