将复杂的自定义结构数组写入文件Objective C.

时间:2012-06-28 15:53:57

标签: objective-c struct load nsmutablearray save

我需要保存并加载结构数组的内容,但我知道Objective C非常特别关于可以读/写的数据类型。

这是我的结构:

struct SCourse 
{
    NSMutableArray* holes; // holds integers (pars)
    NSString*       name;
    int             size;
    BOOL            inUse; 
};

@interface CoursesManager : NSObject
{
    struct SCourse courses[5];
}

我需要使用哪些数据类型?他们每个人都有不同的方法来读/写吗?我只是在寻找一种非复杂的方法来获取我需要的所有数据和文件。我可以用我更熟悉的语言(C ++)轻松地完成这项工作,但Objective-c的一些细节仍然在我身上丢失。

编辑:解决方案(感谢大家的帮助)

-(void)applicationWillResignActive:(UIApplication *)application  {

    // save the courses
    NSMutableArray* totalWriteArray = [[NSMutableArray alloc] initWithCapacity:MAX_COURSES];

    for (int i = 0; i < MAX_COURSES; ++i) 
    {
        struct SCourse saveCourse = [coursesManager GetCourseAtIndex:i];

        NSNumber* nInUse = [NSNumber numberWithBool:saveCourse.inUse];      
        NSNumber* nSize = [NSNumber numberWithInt:saveCourse.size];

        NSMutableArray* writeArray = [[NSMutableArray alloc] initWithCapacity:4];
        [writeArray addObject:nInUse];
        [writeArray addObject:nSize];
        [writeArray addObject:saveCourse.name];
        [writeArray addObject:saveCourse.holes];
        [totalWriteArray addObject:writeArray];
    }

    [totalWriteArray writeToFile:[self saveFilePath] atomically:YES]; 
}

加载回来......

-(void)loadFile {

    NSString *myPath = [self saveFilePath];
    BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:myPath];
    if (fileExists) {
        NSMutableArray* totalReadArray = [[NSMutableArray alloc] initWithContentsOfFile:[self saveFilePath]];

        for (int i = 0; i < MAX_COURSES; ++i) 
        {
            struct SCourse loadCourse = [coursesManager GetCourseAtIndex:i];

            NSMutableArray* loadArray = [totalReadArray objectAtIndex:i];

            NSNumber* nInUse = [loadArray objectAtIndex:0];
            loadCourse.inUse = [nInUse boolValue];           

            NSNumber* nSize = [loadArray objectAtIndex:1];
            loadCourse.size = [nSize integerValue];

            NSString* inName = [loadArray objectAtIndex:2];
            loadCourse.name = inName;

            NSMutableArray* inHoles = [loadArray objectAtIndex:3];
            loadCourse.holes = inHoles;

            [coursesManager ReplaceCourseAtIndex:i With:loadCourse];
        }
    } 
}

3 个答案:

答案 0 :(得分:1)

一种简单的方法是将这些数组存储在NSMutableDictionary对象中,并使用以下方法:

[mutableDict writeToFile:@"path/to/file" atomically:YES];

存储数据和:

NSMutableDictionary *anotherDict = [NSMutableDictionary dictionaryWithContentsOfFile:@"path/to/file"];

重新阅读内容。

答案 1 :(得分:1)

以下是我的建议:

创建一个包含所需属性的自定义类(.h文件):

#import <Foundation/Foundation.h>

@interface CustomHolder : NSObject {
    NSString *last;
    NSString *first;
    NSString *middle;
}

@property (strong, nonatomic) NSString *last;
@property (strong, nonatomic) NSString *first;
@property (strong, nonatomic) NSString *middle;

@end

然后设置.m文件,以便您可以对对象进行编码/解码

#import "CustomHolder.h"

@implementation CustomHolder

@synthesize last, first, middle;

- (void)encodeWithCoder:(NSCoder *)encoder 
{
    [encoder encodeObject:first forKey:@"first"];
    [encoder encodeObject:last forKey:@"last"];
    [encoder encodeObject:middle forKey:@"middle"]; 
}

- (id)initWithCoder:(NSCoder *)decoder 
{
    if (self = [super init]) 
    {
        self.first = [decoder decodeObjectForKey:@"first"];
        self.last = [decoder decodeObjectForKey:@"last"];
        self.middle = [decoder decodeObjectForKey:@"middle"]; 
    }
    return self;
}

@end

然后你可以         [NSKeyedArchiver archiveRootObject:obj toFile:[self saveFilePath]]保存和             [NSKeyedUnarchiver unarchiveObjectWithFile:[self saveFilePath]]加载

这可能与使用C-structs最相似(特别是因为ARC不允许你使用结构)。

答案 2 :(得分:1)

首先是第一件事。你不应该使用普通的旧C结构。 ARC内存管理不会欣赏。

如果您熟悉C ++,您应该使用C ++类,这将取悦编译器和运行时。取决于你想做什么。

阵列。使用NSArray或std :: vector,但请不要使用普通的C数组。不确定ARC将如何处理这个,但我想它不会太欣赏。 Objective-C和C ++都提供了处理任何集合所需的所有工具。

序列化。你有几种可能性,其中一种是NSCoder。

最后一句话,使用所谓的现代语法,将事物转换为ObjC对象非常容易。

BOOL b = YES;
int i = 10;
double d = 3.14;
char* s = "Pouf pouf";

你可以通过boxin获得ObjC等价物。啄:

NSNumber* bo = @( b );
NSNumber* io = @( i );
NSNumber* do = @( d );
NSString* so = @( s );
NSArray* ao = @[ @( i ), do ];
NSDictionary* = @{ @"num" : io, @"str" : @( s ) };

在文件中写一些东西,一步一步:

[@{ @"bool" : bo, @"array" : @[ @"string", @10, @( 10 + 20 ) ] }
    writeToFile: @"path.plist" atomically: YES];

但问题仍然存在,你想要完成什么?