0

我需要保存和加载结构数组的内容,但我知道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];
        }
    } 
}
4

3 回答 3

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 结构最相似(尤其是因为 ARC 不允许您使用结构)。

于 2012-06-28T16:10:56.720 回答
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'thingy 获得 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];

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

于 2012-06-28T16:12:17.370 回答
1

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

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

存储数据并:

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

重新读取内容。

于 2012-06-28T16:07:07.003 回答