保存自定义对象的 NSArray

2023-12-13

我创建了 UIImage (UIImageExtra) 的子类,因为我想包含额外的属性和方法。

我有一个包含此自定义类的实例的数组。但是,当我保存该数组时,似乎 UIImageExtra 类中的额外数据未保存。

UIImageExtra 符合 NSCoding,但 initWithCoder 或encodeWithCoder 都不会被调用,因为我添加的 NSLog 语句不会被打印。

我保存数组的方法如下所示:

- (void)saveIllustrations {
if (_illustrations == nil) {
    NSLog(@"Nil array");
    return;
}

[self createDataPath];
//Serialize the data and write to disk
NSString *illustrationsArrayPath = [_docPath stringByAppendingPathComponent:kIllustrationsFile];
NSMutableData *data = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver encodeObject:_illustrations forKey:kIllustrationDataKey];
[archiver finishEncoding];
[data writeToFile:illustrationsArrayPath atomically: YES];
}

UIImageExtra 有以下委托方法用于保存:

    #pragma mark - NSCoding

- (void)encodeWithCoder:(NSCoder *)aCoder {
    NSLog(@"Encoding origin data!");
    [super encodeWithCoder:aCoder];
    [aCoder encodeObject:originData forKey:kOriginData];
}

- (id)initWithCoder:(NSCoder *)aDecoder {
    if (self = [super initWithCoder:(NSCoder *) aDecoder]) {
        NSLog(@"Decoding origin data");
        self.originData = [aDecoder decodeObjectForKey:kOriginData];
    }
    return self;
}

我首先创建数组的代码如下所示(如果提供任何线索)

        for (NSDictionary *illustrationDict in illustrationDicts) {
        NSString *illustrationString = [illustrationDict objectForKey:@"Filename"];
        NSNumber *xCoord = [illustrationDict objectForKey:@"xCoord"];
        NSNumber *yCoord = [illustrationDict objectForKey:@"yCoord"];
        UIImageExtra *illustration = (UIImageExtra *)[UIImage imageNamed:illustrationString];

        //Scale the illustration to size it for different devices
        UIImageExtra *scaledIllustration = [illustration adjustForResolution];
        NSValue *originData = [NSValue valueWithCGPoint:CGPointMake([xCoord intValue], [yCoord intValue])];
        [scaledIllustration setOriginData:originData];
        [self.illustrations addObject:scaledIllustration];
    }

或者我只是以错误的方式保存这些数据?非常感谢。


初始化数组的代码实际上并未创建 UIImageExtra 子类的实例。

UIImageExtra *illustration = (UIImageExtra *)[UIImage imageNamed:illustrationString];

返回一个 UIImage。铸造它并没有达到您的预期。

UIImageExtra *scaledIllustration = [illustration adjustForResolution];

is still只是一个 UIImage。

解决这个问题的一种简单但详细的方法是使 UIImageExtra 成为wrapper围绕 UIImage。包装器将有一个用于从 UIImage 进行初始化的类方法:

+ (UIImageExtra)imageExtraWithUIImage:(UIImage *)image;

然后你想要调用的每个 UIImage 方法都必须转发到包装的 UIImage 实例 - 还要小心地重新包装例如的结果-adjustForResolution以免您再次得到一个未包装的 UIImage 实例。

一种更复杂的 Objective-C 方法是将您想要的功能添加到Category在 UIImage 上,然后使用方法混合将 NSCoding 方法替换为您的类别实现。其中棘手的部分(除了所需的 Objective-C 运行时体操)是在哪里存储“额外”数据,因为您无法在类别中添加实例变量。 [标准答案是有一个后备字典,由 UIImage 实例的某种合适的表示形式(如包含其指针值的 NSValue)作为键,但正如你可以想象的那样,簿记很快就会变得复杂。]

退后一步,我对新的 Cocoa 程序员的建议是:“想一个更简单的方法。如果你想做的事情这么复杂,那就尝试别的方法。”例如,写一个简单的ImageValue类有一个-image方法和-extraInfo方法(并实现 NSCoding 等),并将其实例存储在数组中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

保存自定义对象的 NSArray 的相关文章

随机推荐

  • 如何从文件中删除与正则表达式不匹配的行?

    我有一个大文件 如下所示 7f0c41d6 f9c6 47aa a034 d40bc629c973 csv 159890 159891 24faaed6 62ee 4175 8430 5d73b09911c8 csv 159907 5bad
  • 如何在后台启动 PhantomJS + Selenium 窗口?

    我在我的应用程序中使用 selenium phantomjs 但我想在后台启动我的应用程序 selenium 和 phantomjs 窗口 我该怎么做 I tried PhantomJSOptions options new Phantom
  • 从 S3 传输到 Google 存储 - 密钥不正确

    过去几个小时我一直在尝试设置从 S3 到我的谷歌存储桶的传输 创建传输时 我不断收到的错误是 访问密钥无效 请确保 S3 存储桶的访问密钥正确 或将存储桶权限设置为授予所有人 访问密钥和秘密都是正确的 因为它们当前在生产中用于 S3 完全访
  • 一组中的 d3 矩形干扰另一组中的矩形

    我有一个小组叫groove它有两个矩形 这些与数据无关 我也有一个群叫group其中有许多与数据绑定的矩形 在第二组中称为group只有三个数据点 但只显示两个 为什么第一个没有被渲染 我以前见过这个 但不记得如何解决 var margin
  • JavaScript 绑定问题

    这是让我感到困惑的代码片段 var timer start function var self this Why the code below doesn t write to this window setInterval self ti
  • 模板类的 CUDA 链接器错误

    在 ubuntu 上使用 CUDA 5 0 和 gcc g 4 6 在使用模板链接 CUDA 代码时遇到错误 cu array cu include cu array hpp template
  • C# - 如何将图像转换为 8 位彩色图像?

    我需要将从文件加载的 PNG 图像转换为另一个设备使用的每像素 8 位字节数组 嵌入式编程 我正在逐像素复制到使用 16 位颜色创建的新图像中 Format16bppRgb565 但是我需要Format8bpp NET Framework
  • Java 中的修剪字符

    如何在 Java 中修剪字符 e g String j joe jill Trim new char j应该 乔 吉尔 String j jack joe jill Trim jack j应该 乔 吉尔 etc 阿帕奇共享区有一个伟大的St
  • UISearchDisplayController隐藏导航栏

    我看到一个奇怪的情况 我在导航栏中放置了一个搜索栏 并将 UISearchDisplayController 与搜索栏链接起来 现在 当用户单击搜索栏时 搜索显示控制器倾向于隐藏导航栏 因此也隐藏搜索栏 为了解决这个问题 我对 UISear
  • CDI Eager Application 作用域 bean

    Since ManagedBean eager true 将被弃用 您如何创建eager 应用程序范围的 cdi bean 通过使用 CDI 扩展框架解决了这个问题 创建预选赛 Qualifier Target value ElementT
  • 将两个数据库表合二为一?

    在将关系数据库建模为库存管理系统时 我遇到了一些麻烦 目前 它只有 3 个简单的表 Product ID Name Price 收入 ID Date Quantity Product ID FK Sales ID Date Quantity
  • 如何将 Joda-Time DateTimeFormat.forStyle() 转换为 JSR 310 Java 时间?

    我正在将 Grails Joda Time 插件转换为JavaTime 我有旧的乔达时间代码 如下所示 def style switch type case LocalTime style S break case LocalDate st
  • Java:递归查找列表中的最小元素

    我会先说这是家庭作业 我只是在寻找一些指示 我一直在为这个问题绞尽脑汁 但我一生都没有明白 我们被要求找到列表中的最小元素 我知道我在这里需要一个子列表 但之后我不确定 任何指示都会很棒 谢谢 Find the minimum elemen
  • Metal RGB 到 YUV 转换计算着色器

    我正在尝试编写一个 Metal 计算着色器来从 RGB 转换为 YUV 但遇到构建错误 typedef struct float3x3 matrix float3 offset ColorConversion Compute kernel
  • 如何检测页面是否为 RSS 或 ATOM 提要

    我目前正在用 PHP 构建一个新的在线 Feed 阅读器 我正在开发的功能之一是提要自动发现 如果用户输入网站 URL 脚本将检测到它不是提要 并通过解析 HTML 来查找正确的提要 URL tag 问题是 我目前检测 URL 是否为提要或
  • 如何将故事板合并到cocos2d 2.0项目中?

    我在 cocos2d 2 0 中做了一个项目 想使用故事板合并一个主菜单 我在tinytimgames com上尝试过Jerrod Putnam的教程 我无法提供链接 因为新用户每个帖子只允许有2个链接 但如果你用谷歌搜索 cocos2d
  • 将 UIView 叠加到 Cocos 层上?

    我是 iOS 和 Cocos 开发新手 目前 我的 HelloWorldLayer 类中有一个基本的应用程序 它包含我的精灵和触摸交互方法 一切都很好 我正在尝试在当前看到的内容之上添加另一个 面板 UIView 最终 该面板将具有与主画布
  • 浏览器什么时候执行Javascript?执行光标如何移动?

    我想知道是否有任何可用资源来描述浏览器光标如何执行 Javascript 我知道它会在页面加载时加载并执行标签 并且您可以将函数附加到各种窗口事件 但事情变得模糊的是 例如 我通过 AJAX 检索远程页面并将其内容放入 div 中 如果该远
  • 低延迟(< 2s)实时视频流 HTML5 解决方案?

    由于 Chrome 很快就会默认禁用 Flash 我需要开始研究 flash rtmp html5 替代解决方案 目前 使用 Flash RTMP 我有一个延迟 我尝试过 MPEG DASH 它似乎是流媒体的新行业标准 但效果不佳 5 秒延
  • 保存自定义对象的 NSArray

    我创建了 UIImage UIImageExtra 的子类 因为我想包含额外的属性和方法 我有一个包含此自定义类的实例的数组 但是 当我保存该数组时 似乎 UIImageExtra 类中的额外数据未保存 UIImageExtra 符合 NS