2011-12-13 51 views
0

我想创建自己的类来管理矩阵,但我是Objective-C的新手。与内存管理概念的误解有关的错误?

矩阵类 我创建这个类来管理矩阵,将它保存在NSMutableArrayNSMutableArray's中。

@interface matrix : NSObject 
{ 
    NSMutableArray *grid; 

    // Dimensiones de la matriz. 
    NSUInteger num_columns; 
    NSUInteger num_rows; 

} 

我创建了一个方法来添加行,列和其他操作。该方法addRow是这样的:

-(BOOL) addRow:(NSArray *) fila 
{ 
    NSLog(@"Dentro de Añadir una Fila de una matriz."); 

    [grid addObject:fila]; 

    [self checkDimensions]; 

    return YES; 
} 

我使用extern类的方法。该方法非常简单,因为我只想创建一个矩阵并将其打印出来。

-(BOOL) matrixTEST 
{ 
    NSLog(@"Dentro de Testeo de una matriz."); 

    // create a new instance 
    matrix *m = [[matrix alloc] init]; 

    NSMutableArray *vector = [[NSMutableArray alloc] init]; 
    [vector addObject:@"1"]; 
    [vector addObject:@"2"]; 
    [vector addObject:@"3"]; 
    [m addRow:vector];  
    [vector removeAllObjects]; 
    [vector addObject:@"4"]; 
    [vector addObject:@"5"]; 
    [vector addObject:@"6"]; 
    [m addRow:vector]; 
    [vector removeAllObjects]; 
    [vector addObject:@"7"]; 
    [vector addObject:@"8"]; 
    [vector addObject:@"3"]; 
    [m addRow:vector]; 
    [vector removeAllObjects];; 

    // print matriz 
    [m imprimirMatriz]; 

    [vector release]; 
    return YES; 
} 

问题是我不知道我在做什么错,因为方法printMatrix显示错误的访问或零错误。此外,定义为包含行数和列数的变量显示奇怪的值:- Rows : 5.75753e+228 - Columns : 8.55507e-53

打印Matrix的方法。

-(void) imprimirMatriz 
{ 
    NSMutableArray *temp = [[NSMutableArray alloc] init]; 
    // NSNumber *numero = [[NSNumber alloc] init]; 

    NSLog(@"Dentro de imprimir matriz."); 

    [self printDimensions]; 

    for(NSUInteger c = 0; c < num_rows; c++) 
    { 
     temp = [grid objectAtIndex:c]; 

     for(NSUInteger d = 0; d < num_columns; d++) 
     { 
      NSLog(@" %3g ", [temp objectAtIndex:d]); 
     } 
     NSLog(@"\n"); 
    } 

    [temp release]; 
} 

回答

3

在您的函数-(BOOL) matrixTest中插入字符串。这很好。但是,当您在网格数组中打印值时,请指定“%3g”。据我所知,“%g”会打印一个浮点数或一个double值,并且当您的值为字符串时将不起作用。如果用%@替换%g,它应该可以工作。

关于包含数组的宽度和高度的变量:您尚未提供如何设置这些变量的实现,因此无法知道问题是什么。

另外,还有一些其他错误。在-(void) imprimirMatriz中,您有行NSMutableArray *temp = [[NSMutableArray alloc] init];,但您稍后将temp分配给了其他内容。这会导致内存泄漏。当你将一个变量赋值给某个NSArray的时候,Alloc/init并不是必需的。

作为您的评论的答案:您只能将对象插入NSMutableArray(或NSArray)。当您编写[myArray addObject:1]时,您尝试插入一个基本整数。基元(int,bool,char,float,double等)不是对象,因此不能插入到NSArray或NSMutableArray中。相反,你可以通过将它包装在一个NSNumber的实例中来插入一个int。以下行将起作用:[myArray addObject:[NSNumber numberWithInt:1]];。你也可以在NSNumber对象中拥有浮动和其他类型。请参阅NSNumber Class Reference以获取完整参考。

+0

感谢您的回答。但另一个问题。我想在数组中插入数字(float)而不是字符串。但是当我在init方法中写入某些东西时,不用@“”获取警告消息。 –

+0

我已经更新了我的回答以容纳您的评论:) – Bendik

+0

感谢您的更新答案。 –

2

你应该在你的测试函数中为每一行使用一个新的数组 - 否则你将三次添加一个指向同一个对象的指针,删除所有对象并重新填充。我预计在上面的代码的末尾,你的矩阵中有三个相同的空数组副本。

所以,与其

[m addRow:vector];   
[vector removeAllObjects]; // This removes the objects from the array in your matrix as well! 

[m addRow:vector]; 
[vector release]; 
vector = [NSMutableArray alloc] init]; 

最后​​将空(在你的矩阵等空的每一行)的阵列,但不会更新您的内部尺寸变量,所以是可能会在稍后导致错误。

此外,正如Bendik所说,您的日志语句对于字符串格式不正确。它应该是%@

+0

感谢您的回答。但知道仍然有问题。 –