与误解内存管理概念有关的错误?

时间:2011-12-13 13:20:41

标签: objective-c pointers memory-management nsmutablearray

我正在尝试创建自己的类来管理矩阵,但我是Objective-C的新手。

矩阵课 我正在创建此类来管理矩阵,将其保存在NSMutableArray NSMutableArray的{​​。}}中。

@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

打印矩阵的方法。

-(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];
}

2 个答案:

答案 0 :(得分:3)

在函数-(BOOL) matrixTest中插入字符串。这很好。但是,当您在网格数组中打印值时,请指定“%3g”。据我记得,“%g”打印浮点数或双精度数,当值为字符串时,它们将无效。如果用%@替换%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

答案 1 :(得分: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];

最后一个removeAllObjects会清空数组(因此会清空矩阵中的每一行),但不会更新内部维度变量,因此以后可能会导致错误。

此外,正如Bendik所说,你的日志语句的字符串格式错误。它应该是%@