NSObject-AutomagicCoding 1.1.1

NSObject-AutomagicCoding 1.1.1

测试已测试
语言语言 Obj-CObjective C
许可 MIT
发布上次发布2014年12月

未声明维护。



  • Stepan Generalov

AMC

AMC 是自动魔法编码 - Mac & iOS 项目的非常容易使用的 NSCoding 替代方案。AMC 使您能够创建任何受支持对象的 NSDictionary 表示形式,将其保存为 PLIST(或任何其他 PLIST 兼容的文件格式,例如 JSON),并在不编写大量代码的情况下再次加载数据。

AMC 使用 Objective-C 运行时来自动确定对象的属性,并使用键值编码来获取和设置它们。

仓库内容

  • AutoMagicCoding/ - 包含您需要导入到项目中的所有 AMC 源代码。
  • Tests/ - 包含所有 AMC 单元测试源代码。
    • ObjectsForTests/ - 包含在单元测试中使用的测试类。它是如何使用 AMC 的好例子。
  • SupportingFiles/ - XCode 东西(Info.plists、xibs、main.m 等…)
  • AutoMagicCoding.xcodeproj - 用于在 Mac 上测试 AMC 的 Mac XCode 项目。
  • AutoMagicCoding-iOS.xcodeproj - 用于在 iOS 上测试 AMC 的 iOS XCode 项目。
  • README.md - 包含您正在阅读的文本。 ;)

支持的属性类型

  • AMC 启用对象。
  • 常见集合(NSArray、NSMutableArray、NSDictionary、NSMutableDictionary)
  • 自定义集合(可变/不可变,可以用作 key-value(字典)或有序(数组)集合)
    • 注意:自定义和/或可变集合在集合内部不会被识别。有序集合被视为 NSArray,key-value 集合被视为 NSDictionary。
  • 常见结构(NSRect/CGRect、NSSize/CGSize、NSPoint/CGPoint)。
  • 自定义结构(您需要编写额外的代码来将它们编码/解码为 NSString)。

文件格式

AMC 将对象保存到 NSDictionary,该对象可以保存为 PLIST(或 JSON)。
键只是 ivars 名称和/或属性名称。
一个特殊键( "class" )用于存储对象的类名。
在 Mac 上运行单元测试,并查看您的文档文件夹 - 那里会有很多 PLIST。
它们是保存到 PLIST 文件中的测试对象。

已知问题

  • 结构不能是 ivars - 必须在 AMC 中将其用作属性(问题 #10)。
  • 在 XCode 中运行 iOS 单元测试时有些问题。有关详细信息,请参阅问题 #9。

如何使用

  1. 将NSObject+AutoMagicCoding.h | m拖放到您的项目中。这将向从NSObject继承的所有对象添加AMC方法。
  2. 在需要的地方导入NSObject+AutoMagicCoding.h。
  3. 重写+(BOOL)AMCEnabled并在其中返回YES来为您的类的所有实例启用AMC。
  4. 重写-initWithDictionaryRepresentation:并在其中使用[super initWithDictionaryRepresentation]以确保所有集合与其他字段在调用父类init之后创建。之后执行您自己的初始化程序。
  5. 使用-dictionaryRepresentation将对象编码为NSDictionary,并使用NSObject::objectWithDictionaryRepresentation:进行解码。
  6. 另外:重写-AMCKeysForDictionaryRepresentation以更改已编码/解码字段的数量和顺序。(有关更多信息,请参阅下面的AMCKeysForDictionaryRepresentation)。
  7. 另外:重写-AMCEncodeStructWithValue:withName:与-AMCDecodeStructWithValue:withName:以支持自定义结构体(有关更多信息,请参阅下面的自定义结构体)。
  8. 另外:重写-AMCFieldTypeForValueWithKey:以使用AMC作为字段的所有非标量实例变量。

    注意:由于更困难的内存管理、需要编写更多代码、不支持自定义结构体以及可能未来的限制,建议避免在AMC中使用没有属性的实例变量。

AMCKeysForDictionaryRepresentation

-AMCKeysForDictionaryRepresentation返回一个包含NSString的NSArray,这些字符串将传递给KVC方法以获取并设置AMCEnabled对象的字段。默认实现返回所有对象属性的全集(包括只读和读写属性),包括由超类声明的属性(NSObject的属性不包括在内)。重写此方法以手动选择由AMC进行编码/解码的属性。有关更多信息和使用示例,请参阅“测试”文件夹中的测试。

自定义结构体支持

要支持您的自定义结构体,您必须执行以下操作

  1. 您的自定义结构体应仅用作您类中的属性。不支持作为实例变量的自定义结构体。
  2. 如这样重写-AMCEncodeStructWithValue:withName:与-AMCDecodeStructFromString:withName:
- (NSString *) AMCEncodeStructWithValue: (NSValue *) structValue withName: (NSString *) structName
{
    if ([structName isEqualToString: @"CustomStruct" ])
    {
        CustomStruct custom;
        [structValue getValue: &custom]; 

        return NSStringFromCustomStruct(custom);
    }

    return [super AMCEncodeStructWithValue: structValue withName: structName];
}

- (NSValue *) AMCDecodeStructFromString: (NSString *)value withName: (NSString *) structName
{
    if ([structName isEqualToString: @"CustomStruct" ])
    {
        CustomStruct custom = CustomStructFromNSString(value);
        return [NSValue valueWithBytes: &custom objCType:@encode(CustomStruct)];
    }

    return [super AMCDecodeStructFromString: value withName: structName];
}

请参阅FooWithStructs及AMCTestSimple以查看有效的例子。

异常

所有异常、坏数据和不希望的测试都位于AMCExceptions.m中。

以下是使用AMC可能发生的一些坏事情:

  • 编码(调用-dictionaryRepresentation)
    1. 不支持的架构:抛出AMCEncodeException(请参阅上面的自定义结构体支持)。
    2. -AMCKeysForDictionaryRepresentation中的无效键:抛出NSUnkownKeyException。(无效键 = 没有这样的属性、实例变量或方法 - 有关详细信息,请参阅KVC编程指南)。
    3. 使用-dictionaryRepresentation中的-whether-for-property的支持KVC故障,当使用-size不为4的倍数的结构体的方法属性时:抛出AMCKeyValueCodingFailureException(问题#19)。
  • 解码(调用+objectWithDictionaryRepresentation:与-init-withDictionaryRepresentation:)
    1. 不支持的架构:抛出AMCDecodeException(请参阅自定义结构体支持)。
    2. -AMCKeysForDictionaryRepresentation与字典表示法键不匹配:不抛出异常。仅使用字典表示法中键的交集来设置解码对象字段的值。因此,始终检查-your-init-withDictionaryRepresentation中的必要字段,并在它们为nil时创建它们。
    3. 字典表示法中标量键的对象:KVC将抛出NSInvalidArgumentException,即如果您尝试使用其自己的字典表示法作为整数赋值给对象。
    4. 字典表示法中对象键的标量:不抛出异常。对象不会被设置 - 因此您的属性仍将处理nil。
    5. 在字典表示形式中对对象键使用不同类名的对象:不会抛出异常。也就是说,可以设置 Foo 实例为 Bar 类属性的 AMC。它们的属性可以设置用 AMC 或保留为 nil。在调用 super 后,如果需要,请在 -initWithDictionaryRepresentation: 中进行 [self.foo isKindOfClass: [Foo class]] 检查。

AMC_NO_THROW

可以定义 AMC_NO_THROW 以禁用以下方法抛出异常

  • +objectWithDictionaryRepresentation
  • -initWithDictionaryRepresentation
  • -loadValueForKey:fromDictionaryRepresentation
  • -dictionaryRepresentation

如果定义了 AMC_NO_THROW,它们将简单地返回 nil 和/或什么都不做。
-AMCDecodeStructFromString:withName: 和 -AMCEncodeStructWithValue:withName: 即使定义了 AMC_NO_THROW 也可以抛出异常。不要在你的这些方法的实现中捕获任何异常——你不需要直接调用它们,因此 AMC 会为你捕获它们的异常。

许可证

AMC 在 MIT 许可证的条款和条件下授权。
http://www.opensource.org/licenses/mit-license.php

版权所有 2011 Stepan Generalov。

特此授予任何人免费获取此软件及其相关文档副本(“软件”)的副本的许可权
使用该软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售该软件的副本的,并允许向获得该软件的人提供上述软件副本,前提是
以下条件:
上述版权声明和本许可声明应包含在软件的任何副本或主要部分中。
软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、针对特定目的的适用性和不侵犯。在任何情况下,作者或版权所有者不对任何索赔、损害或其他责任负责,无论这些索赔是由于合同、侵权还是其他行为产生的,以及与软件或软件的使用或其他交易有关。
软件的使用。

特此授予,任何人从以上来源免费获得此软件及其相关文档副本的副本的许可权
为使用该软件。

以上版权声明和本许可声明应包含在软件的任何副本或主要部分中。
软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、针对特定目的的适用性和不侵犯。在任何情况下,作者或版权所有者不对任何索赔、损害或其他责任负责,无论这些索赔是由于合同、侵权还是其他行为产生的,以及与软件或软件的使用或其他交易有关。
软件的使用。
特此授予,任何人从以上来源免费获得此软件及其相关文档副本的副本的许可权
为使用该软件。
以上版权声明和本许可声明应包含在软件的任何副本或主要部分中。
软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、针对特定目的的适用性和不侵犯。在任何情况下,作者或版权所有者不对任何索赔、损害或其他责任负责,无论这些索赔是由于合同、侵权还是其他行为产生的,以及与软件或软件的使用或其他交易有关。