Ошибка, связанная с неправильным пониманием концепции управления памятью? - PullRequest
0 голосов
/ 13 декабря 2011

Я пытаюсь создать свой собственный класс для управления матрицами, но я новичок в 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 ]

3 голосов
/ 13 декабря 2011

В вашей функции -(BOOL) matrixTest вы вставляете строки.Это прекрасно.Но когда вы печатаете значения в вашем сеточном массиве, вы указываете «% 3g»."% g" печатает, насколько я помню, число с плавающей запятой или двойное число, и не будет работать, если ваши значения являются строками.Если вы замените% g на% @, он должен работать.

Относительно переменных, содержащих ширину и высоту массива: вы не предоставили свою реализацию того, как вы устанавливаете эти переменные, поэтому невозможно узнать, чтопроблема в том.

Как примечание, у вас есть и другие ошибки.в -(void) imprimirMatriz у вас есть строка NSMutableArray *temp = [[NSMutableArray alloc] init];, но позже вы назначаете temp что-то еще.Это вызывает утечку памяти.Alloc / init не является обязательным, когда вы назначаете переменную чему-либо из NSArray.

В качестве ответа на ваш комментарий: вы можете вставлять объекты только в NSMutableArray (или NSArray для этого).Когда вы пишете [myArray addObject:1], вы пытаетесь вставить примитивное целое число.Примитивы (int, bool, char, float, double и т. Д.) Не являются объектами и поэтому не могут быть вставлены в NSArray или NSMutableArray.Вместо этого вы можете вставить int, поместив его в экземпляр NSNumber.Будет работать следующая строка: [myArray addObject:[NSNumber numberWithInt:1]];.Вы также можете иметь плавающие и другие типы в объекте NSNumber.См. Ссылка класса NSNumber для полной ссылки.

2 голосов
/ 13 декабря 2011

Вы должны использовать новый массив для каждой строки в вашей тестовой функции - в противном случае вы добавляете указатель на один и тот же объект три раза, удаляя все объекты и повторно заполняя.Я ожидаю, что к концу кода выше у вас будет три копии одного и того же пустого массива в вашей матрице.

Итак, вместо

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

Do

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

Последнее removeAllObjects будет очищать массив (и, следовательно, очищать каждую строку в вашей матрице), но не обновлять ваши внутренние переменные измерения, поэтому в дальнейшем может привести к ошибкам.

Кроме того, как говорит Бендик, ваш оператор журнала имеет неверный формат для строк.Это должно быть% @

...