Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.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上使用encodeWithCoder:and initWithCoder:on?_Iphone_Objective C_Cocoa Touch_Initwithcoder - Fatal编程技术网

你什么时候在iPhone上使用encodeWithCoder:and initWithCoder:on?

你什么时候在iPhone上使用encodeWithCoder:and initWithCoder:on?,iphone,objective-c,cocoa-touch,initwithcoder,Iphone,Objective C,Cocoa Touch,Initwithcoder,正如我在上述主题中提出的问题所述,为了说“好的,我需要encodeWithCoder:和initWithCoder:为此进行实例化”,您通常必须满足哪些要求?通常,您可以将对象状态写入NSUserDefaults,因此我很好奇专家们什么时候决定使用其中一种还是另一种?NSCoder是实现序列化的标准Cocoa方法。有关详细信息,请参见苹果的。用户默认值基本上是一个属性列表。属性列表类似于JSON,只能存储特定类型的数据——NSString、NSNumber、NSData、NSDate、NSArr

正如我在上述主题中提出的问题所述,为了说“好的,我需要
encodeWithCoder:
initWithCoder:
为此进行实例化”,您通常必须满足哪些要求?通常,您可以将对象状态写入
NSUserDefaults
,因此我很好奇专家们什么时候决定使用其中一种还是另一种?

NSCoder
是实现序列化的标准Cocoa方法。有关详细信息,请参见苹果的。

用户默认值基本上是一个属性列表。属性列表类似于JSON,只能存储特定类型的数据——NSString、NSNumber、NSData、NSDate、NSArray、NSDictionary。如果您尝试在用户默认值中存储任何其他内容,您将得到一个异常。属性列表也不能处理任意对象图,只能处理树


您可以始终将自定义状态转换为与属性列表兼容的数据结构,然后将其存储在用户默认值中;但是你基本上是在实现一个对象序列化机制,你也可以使用NSArchiver已经提供的更强大的机制。

initWithCoder:
由操作系统在取消归档XIB文件时使用;如果仔细观察,您会发现在XIB中创建的视图不会调用
initWithFrame:
;他们将调用
initWithCoder:

每当我有某种复杂的数据要存储时,我都会使用NSCoder,而这些数据从来不用手工编辑。例如,我的应用程序将从Internet下载的货币汇率存储在NSCoder存档中。然而,这是它保存在这样一个归档文件中的唯一内容:单位定义(只能手动更改)保存在应用程序包中的一系列plist文件中,最近选择的单位和值等内容保存在NSUserDefaults中。

嗨,Ben,我在使用XIBs时,没有这种方法也能过得很好。对于以编程方式构建的视图,我通常只使用loadView即可。对于使用IB构建的视图,我使用viewDidLoad{}。因此,我试图理解使用initWithCoder何时有意义: