我需要保存并加载结构数组的内容,但我知道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];
}
}
}
答案 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];
但问题仍然存在,你想要完成什么?