【发布时间】:2012-06-28 15:53:57
【问题描述】:
我需要保存和加载结构数组的内容,但我知道 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];
}
}
}
【问题讨论】:
-
这与在 C/C++ 中做这件事并没有真正的太不同,是吗?从
NSMutableArray中提取值与从std::vector中提取值并没有太大区别是吗... -
我不同意。我想过为这个小项目编写自己的 std::vector 版本,但我真的没有时间。 NSMutable 数组要求您在转换为 int 之前将其转换为 NSNumber(毫无意义的浪费时间,恕我直言)。大多数(包括这个)操作与他们喜欢的数据类型之间有太多的小步骤,我没有时间去追捕它们。我希望在一个小时内完成,而不是 6 个。
-
你不必写
std::vector;只需将源文件重命名为.mm即可正常使用。 Cocoa 集合类要求您使用NSNumber是有原因的;它们只包含对象,而不是原始类型。
标签: objective-c struct load nsmutablearray save