gpt4 book ai didi

iphone - iOS模拟器中的内部存储器

转载 作者:行者123 更新时间:2023-11-29 10:59:25 25 4
gpt4 key购买 nike

我刚刚完成了 iOS 开发的第二个教程。当我添加新目击时,它工作正常并出现在目击列表中。但是,当我关闭 iOS 模拟器并重新打开它时,只有第一个条目在那里(它是手动添加的)。 iOS模拟器关闭再打开后是否还有内存?似乎有一些内存,好像我将我的联系信息添加到联系人中,当我重新打开它时它仍然存在。如果是这样,我如何确保 DataController 文件中的数组以类似方式存储在模拟器/手机上,以便每次重新打开模拟器时它都不会自行清除?

谢谢

最佳答案

如果要在 session 之间保存数据,则需要使用持久存储。选项包括:

  1. 您可以使用 plist 文件。例如,如果你有 NSArray *array,你可以使用 writeToFile 将其保存到 plist 中。 :

    [array writeToFile:filename atomically:YES];

    然后你可以读取这个数组:

    NSArray *array = [NSArray arrayWithContentsOfFile:filename];

    此技术仅适用于标准 NSStringNSNumber 等对象,但不适用于 BirdSighting 等自定义对象。

  2. 对于像 BirdSighting 这样的自定义对象,您可以使用 NSKeyedArchiver and NSKeyedUnarchiver .顺便说一句,这些不仅是为像这样的小数据集保存数据通常有用的类,而且考虑到它在新的 iOS 6 状态保存功能中占据显着位置,值得您熟悉这种模式。

    <
  3. 您可以使用 NSUserDefaults .这确实更适合应用设置和默认设置,但理论上也可用于保存数据。

  4. 您可以使用 CoreData .这是用于对象持久化的首选 iOS 技术。它是一个功能强大且设计精良的框架(虽然有点复杂),非常适合处理更大量的数据。

  5. 您可以使用 SQLite , 也。看这个Ray Wenderlich article on using SQLite .一旦你开始使用 SQLite,你可以考虑使用 FMDB以简化您的编码工作。


例如,如果您想使用第二种方法,NSKeyedArchiverNSKeyedUnarchiver,您可能要做的第一件事就是制作 BirdSighting 符合 NSCoding,通过改变 BirdSighting.h 中的 @interface 声明来表示:

@interface BirdSighting : NSObject <NSCoding>

其次,你必须在 BirdSighting.m 中编写两个 NSCoding 方法,initWithCoderencodeWithCoder定义可以为此对象加载/保存哪些属性:

- (NSArray *)keysForEncoding;
{
return @[@"name", @"location", @"date"];
}

- (id) initWithCoder:(NSCoder *)aDecoder
{
self = [super init];
if (self) {
for (NSString *key in [self keysForEncoding])
{
[self setValue:[aDecoder decodeObjectForKey:key] forKey:key];
}
}

return self;
}

- (void)encodeWithCoder:(NSCoder *)aCoder
{
for (NSString *key in self.keysForEncoding)
{
[aCoder encodeObject:[self valueForKey:key] forKey:key];
}
}

您的 BirdSighting 现在可以分别使用 NSKeyedUnarchiverNSKeyedArchiver 加载和保存。

因此,关注目击事件的加载,您必须 (a) 告诉 BirdSightingDataController.m 要查找的文件; (b) 指示它在初始化期间读取该文件:

- (NSString *)filename
{
NSString *docsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
return [docsPath stringByAppendingPathComponent:@"BirdSightings"];
}

- (void)initializeDefaultDataList
{
NSString *filename = [self filename];

self.masterBirdSightingList = nil;

if ([[NSFileManager defaultManager] fileExistsAtPath:filename])
{
self.masterBirdSightingList = [NSKeyedUnarchiver unarchiveObjectWithFile:filename];
}

if (!self.masterBirdSightingList)
{
NSMutableArray *sightingList = [[NSMutableArray alloc] init];
self.masterBirdSightingList = sightingList;
BirdSighting *sighting;
NSDate *today = [NSDate date];
sighting = [[BirdSighting alloc] initWithName:@"Pigeon" location:@"Everywhere" date:today];
[self addBirdSightingWithSighting:sighting];
}
}

BirdSightingDataController.m 也可以定义一个方法来保存数据:

- (BOOL)save
{
return [NSKeyedArchiver archiveRootObject:self.masterBirdSightingList toFile:[self filename]];
}

例如,您现在可以在每次添加目击时调用此保存方法,例如:

- (void)addBirdSightingWithSighting:(BirdSighting *)sighting
{
[self.masterBirdSightingList addObject:sighting];

[self save];
}

就个人而言,与其在每次用户对应用程序进行任何更改时都保存它,不如让我的应用程序委托(delegate)在应用程序进入后台或终止时保存它(但这需要进一步更改,所以我不会现在进入)。

但希望这段代码能够说明如何使用 NSKeyArchiverNSKeyUnarchiver 来保存和加载数据。显然,对于更复杂的场景,我通常会鼓励您考虑 Core Data。但是对于像这样的小数据集,这种存档器模式可能很有用(正如我所说,值得熟悉,因为 iOS 6 应用程序状态恢复中也使用了基本技术)。

关于iphone - iOS模拟器中的内部存储器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16680013/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com