2011-12-13 77 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

感謝您的回答。但知道仍然有問題。 –