2010-06-19 2 views
0

Мне нравится делать массив из структуры typedef, которую у меня есть.NSMutableArray with Struct

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

//------------ test STRUCT 
typedef struct 
{ 
    int id; 
    NSString* picfile; 
    NSString* mp3file; 
    NSString* orgword; 
    NSString* desword; 
    NSString* category; 
} cstruct; 

//------- Test Fixed Array 
cstruct myArray[100]; 
myArray[0].orgword = @"00000"; // write data 
myArray[1].orgword = @"11111"; 

NSLog(@"Wert1: %@",myArray[1].orgword); // read data *works perfect 



//------ Test withNSMutable 
NSMutableArray *array = [NSMutableArray array]; 
    cstruct data; 
    int i; 
    for (i = 1; i <= 5; i++) { 
    data.orgword = @"hallo"; 
    [array addObject:[NSValue value:&data withObjCType:@encode(struct cstruct)]]; 
} 

data = [array objectAtIndex:2]; // something is wrong here 
NSLog(@"Wert2: %@",data.orgword); // dont work 

любую короткую демонстрацию, которая работает была бы оценена :) еще учусь

Thx Крис

+0

Ваш массив возвращает экземпляр NSValue ... вот что вы там положили. Итак, чтобы читать: [[массив objectAtIndex: 2] getValue: &data]; –

+0

OK !! :) THX, теперь это работает :) –

ответ

6

Это очень необычно для смешивания структур, содержащих Objective-C типа с объектов в Objective-C. Хотя вы можете использовать NSValue для инкапсуляции структуры, сделать это хрупким, трудноподдерживаемым и может не работать корректно в GC.

Вместо простой класс часто лучший выбор:

@interface MyDataRecord:NSObject 
{ 
    int myRecordID; // don't use 'id' in Objective-C source 
    NSString* picfile; 
    NSString* mp3file; 
    NSString* orgword; 
    NSString* desword; 
    NSString* category; 
} 
@property(nonatomic, copy) NSString *picfile; 
.... etc .... 
@end 

@implementation MyDataRecord 
@synthesize picfile, myRecordID, mp3file, orgword, desword, category; 
- (void) dealloc 
{ 
     self.picfile = nil; 
     ... etc .... 
     [super dealloc]; 
} 
@end 

Это также делает его таким образом, что в тот момент, вам нужно добавить бизнес-логику к указанной записи данных, у вас уже есть удобное место, чтобы сделать это ,