带有Struct的NSMutableArray

时间:2010-06-19 16:10:53

标签: cocoa xcode nsmutablearray

我想用我拥有的typedef结构制作一个数组。

当我使用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 克里斯

1 个答案:

答案 0 :(得分: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

这也使得当您需要将业务逻辑添加到所述数据记录时,您已经有了一个方便的地方。