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

まず最初に。単純な古いC構造体は使用しないでください。ARCメモリ管理は高く評価されません。

C ++に精通している場合は、代わりにC ++クラスを使用する必要があります。これにより、コンパイラとランタイムが満足します。何をしたいかによります。

配列。NSArrayまたはstd::vectorのいずれかを使用しますが、プレーンなC配列は使用しないでください。ARCがこれをどのように処理するかはわかりませんが、あまり評価されないと思います。Objective-CとC++はどちらも、あらゆるもののコレクションを処理するために必要なすべてのツールを提供します。

シリアル化。いくつかの可能性がありますが、そのうちの1つは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 ) };

1つの優雅なステップで、ファイルに何かを書き込むには:

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

しかし、疑問は残ります。何を達成しようとしていますか?

于 2012-06-28T16:12:17.370 に答える
1

簡単な方法の1つは、これらの配列をNSMutableDictionaryオブジェクトに格納し、次のメソッドを使用することです。

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

データを保存するには:

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

内容を読み戻すには。

于 2012-06-28T16:07:07.003 に答える
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 に答える