Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 目标C:保留对象、序列化和非编码_Iphone_Objective C_Ios_Memory Management - Fatal编程技术网

Iphone 目标C:保留对象、序列化和非编码

Iphone 目标C:保留对象、序列化和非编码,iphone,objective-c,ios,memory-management,Iphone,Objective C,Ios,Memory Management,通读这段代码。我在5分钟内把它写在我的办公桌上,它不是生产代码,只是为了展示。然后读下面我的问题: @interface SomeClass : NSObject { NSString *currentFruit; NSMutableArray *fruits; } @property (retain) NSString *currentFruit; @property (retain) NSMutableArray *fruits; @end @implementation Some

通读这段代码。我在5分钟内把它写在我的办公桌上,它不是生产代码,只是为了展示。然后读下面我的问题:

@interface SomeClass : NSObject {

NSString *currentFruit;
NSMutableArray *fruits;

}

@property (retain) NSString *currentFruit;
@property (retain) NSMutableArray *fruits;

@end

@implementation SomeClass
@synthesize currentFruit, fruits;

-(void) createArray {

    self.fruits = [[NSMutableArray alloc] initWithObjects:@"apples",@"oranges",@"grapes",nil];
    self.currentFruit = [fruits objectAtIndex:0];
}

-(void)writeToDisk {
    NSString *filePath = @"/somePath/file.ext";
    NSMutableData *fileData = [NSMutableData data];
    NSKeyedArchiver *coder = [[NSKeyedArchiver alloc] initForWritingWithMutableData:fileData];
    [coder encodeObject:self.fruits forKey:@"fruitArray"];
    [coder encodeObject:self.currentFruit forKey:@"theFruit"];
    [coder finishEncoding];
    [fileData writeToFile:filePath atomically:YES];
    [coder release];
}

-(void)loadDataFromDisk {
    NSString *filePath = @"/somePath/file.ext";
    NSData *fileData = [[NSData alloc] initWithContentsOfFile:filePah];
    NSKeyedUnarchiver *decoder = [[NSKeyedUnarchiver alloc] initForReadingWithData:fileData];
    NSMutableArray *decodedFruits = [decoder decodeObjectForKey:@"fruitArray"];
    NSString *decodedFruit = [decoder decodeObjectForKey:@"theFruit"];
    self.currentFruit = decodedFruit;
    self.fruits = decodedFruits;
    [decoder release];
    [fileData release];
}
假设我使用方法-(void)createArray生成数组,然后将currentFruit的实例设置为数组中的第一个对象。然后我使用-(void)writeDataToDisk并将对象存储到文件中。当我使用loadDataFromDisk时,我的应用程序是否仍然知道currentFruit应该是fruits数组开头的对象?或者我现在会有两个单独的实例吗


我在想办法。我应该跟踪数组索引而不是跟踪实际对象吗?我希望始终引用数组中的对象。这有意义吗?

编辑:我收回了下面的答案,不知何故没有意识到您没有使用NSCoder。下面通过实现NSCoding并仅提供一个根对象来应用于编码。如果您想要的在您的案例中起作用,那么它将是文档之外的一个实现细节,因此不值得依赖

我倾向于相信你会得到同样的目标;当您写出同一对象的多个实例并使用指向原始对象的链接时,归档程序会进行检测。否则,他们将无法写入包含循环引用的对象的任何层次结构-他们将永远写入磁盘。因此,对象“theFruit”来自数组“fruitArray”的信息在存档中进行编码。看


假设您保留了相同的NSKeyedUnarchiver实例,那么假设下面的代码足够智能,可以返回相同的对象,这并不是不合理的。然而,我正在阅读苹果公司关于存储对象图的重点的字里行间文章,却找不到对此的明确确认。

尝试使界面符合NSCoding协议

实现encodeWithCoder和initWithEncoder。 然后可以将对象序列化和反序列化为文件或流

然后执行以下语句:

NSData *data = [NSKeyedarchiver archivedDataWithRootObject:someClassInstance];

这并不能回答你的问题。但这会让你的代码更漂亮

现在你的问题是: 您的应用程序不“知道”当前水果。由于loadDataFromDisk位于实例的作用域中,因此会覆盖实例变量。换句话说:您有一个实例,您将在该实例上调用一个方法。它的内容将会改变,不会有第二个实例。 如果需要两个实例,请使用NSCoding协议


如果希望在多个实例上共享currentfruit,请将currentfruit变量设为静态。

我考虑在数组中为当前对象的索引存储一个整数。我将把我的问题再开放几天,看看是否还有其他答复。谢谢你的意见!我认为我的论点有点复杂:提供一个可以访问所有内容的根对象,然后应该返回相同的对象。所以让每个类自上而下实现NSCoding。在您的例子中,您似乎有一个不实现NSCoding的自然根对象;要么修改它,要么把你想存储的所有东西都放到字典里,然后把字典传给归档员。NSDictionary实现了NSCoding。我确实在我正在从事的项目中实现了NSCoding,我有几个不同的NSObject子类用于存储数据,这些数据都符合NSCoding。因此将有一个initWithCoder和encodeWithCoder方法可用。不过我还是喜欢你的主意。答案标记=)环顾四周,我发现:它似乎回答了我的问题。
SomeClass *instance = [NSKeyedUnarchiver unarchiveObjectWithData:data];