归档和取消归档导致访问错误

2024-04-07

我在设置模型对象以在 iPhone 的简单图形应用程序中保存用户生成的 CALayers 的视觉状态时遇到问题。

我试图通过将这些属性传递给实现 NSCoding 协议的模型对象,然后传递给应用程序委托拥有的 NSMutableArray 来保存屏幕上所有当前图层的背景颜色和框架。然后我使用 NSKeyedArchiver 归档该数组并将其存储在 NSUserDefaults 中。

每个CALayer的backgroundColor属性都会转换为UIColor,由模型对象编码进行存储。我认为我错误地取消归档了数组,或者没有正确地从未归档的数组恢复状态。当我尝试访问存储在模型对象中的 UIColor 对象时,我收到 EXC_BAD_ACCESS。

我认为这可能是编码 UIColor 对象的错误,因此尝试使用 CGColorGetComponents 函数从 CGColorRef 中提取值并将它们存储在数组中进行编码和存档,但在取消存档后我得到了相同的错误访问结果,所以我认为我只是做错了。

这是我的模型对象:

@interface AILayerData : NSObject <NSCoding> {

    UIColor*    color;
    CGRect      frame;
}

@property (retain) UIColor* color;
@property (assign) CGRect   frame;

@end


@implementation AILayerData

@synthesize color;
@synthesize frame;

- (void)encodeWithCoder:(NSCoder *)coder; 
{
    [coder encodeObject:color forKey:@"color"];
    [coder encodeCGRect:frame forKey:@"frame"];
}


- (id)initWithCoder:(NSCoder *)coder;
{
    self = [[AILayerData alloc] init];
    if (self != nil)
    {
        color = [coder decodeObjectForKey:@"color"];
        frame = [coder decodeCGRectForKey:@"frame"];
    }
    return self;
}

@end

这是我的归档实现:

@implementation AppDelegate

- (void)applicationWillTerminate:(UIApplication *)application {

    NSArray *layersArray = viewController.view.layer.sublayers;

    dataArray = [NSMutableArray array]; 

    for(AILayer *layer in layersArray)
    {
        AILayerData *layerData = [[AILayerData alloc] init];

        layerData.frame = layer.frame;

        UIColor *layerColor = [UIColor colorWithCGColor:layer.backgroundColor];

        layerData.color = layerColor;               

        [dataArray addObject:layerData];

        [layerData release];

    }

    [[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:layerDataArray] forKey:@"savedArray"];
}

@end

这是我恢复状态的地方:

@implementation ViewController

- (void)viewDidLoad 
{    
    [super viewDidLoad];

    spaceView = [[AISpaceView alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    self.view = spaceView;

    [spaceView release];

    spaceView.delegate = self;

    NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];

    NSData *dataRepresentingSavedArray = [currentDefaults objectForKey:@"savedArray"];

    if (dataRepresentingSavedArray != nil) {

        [self restoreStateWithData:dataRepresentingSavedArray];

    }
}

- (void)restoreStateWithData:(NSData *)data 
{   
    NSArray *savedLayers = [NSKeyedUnarchiver unarchiveObjectWithData:data];

    if (savedLayers != nil) {

        NSArray *restoredLayers = [[NSArray alloc] initWithArray:savedLayers];

        for(AILayerData *layerDataObject in restoredLayers) {                       

            UIColor *layerColor = layerDataObject.color;

            AILayer *newLayer = [[AILayer alloc] init];         

            newLayer.backgroundColor = layerColor.CGColor;

            newLayer.frame = layerDataObject.frame;         

            newLayer.isSelected = NO;

            [self.view.layer addSublayer:newLayer];

            [newLayer release];                                 
        }

        [restoredLayers release];

        [spaceView.layer layoutSublayers];      
    }
}

@end

非常感谢任何对此的帮助。我几乎是一个菜鸟。我以几乎相同的方式对从颜色浮点数转换而来的 NSNumbers 的 NSArray 进行编码、存档和解压,但访问错误。


您当然希望保留 initWithCoder 中的颜色:

color = [[coder decodeObjectForKey:@"color"] retain];

或者,使用点语法,因为颜色被声明为retain财产:

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

归档和取消归档导致访问错误 的相关文章

  • OSX/Cocoa 应用程序通常使用什么位置来存储数据文件?

    他们是否将它们写入 存储在应用程序包 包本身中 或者其他一些规范位置 还是好像没有什么标准 文件通常会进入 Library Application Support Your App 偏好设置进去 Library Preferences
  • NSUndoManager 会撤消后台发生的更改吗?

    我有一个编辑视图控制器 我正在使用 NSUndoManager 它是我的持久性存储 核心数据项目 的一组 我的应用程序的功能之一是与外部服务器同步 我想知道的是 如果我正在视图中编辑某些内容 同时应用程序正在与服务器同步 如果我改变主意并决
  • 使用 PRODUCT_NAME 构建 cocoapods 项目的 xcodebuild 失败

    我可以使用以下命令构建我的 Cocoapods 项目 base basename xcworkspace xcworkspace xcodebuild sdk iphonesimulator ios version CONFIGURATIO
  • UI键盘回避和自动布局

    鉴于 iOS 6 中对自动布局的关注以及 Apple 工程师的推荐 查看 WWDC 2012 视频 我们不再直接操作视图的框架 那么如何仅使用自动布局和 NSLayoutConstraint 来避免键盘呢 Update 这看起来是一个合理的
  • NSMenuItem 中的自定义 NSView 未接收鼠标事件

    我使用 popUpStatusItemMenu 从 NSStatusItem 中弹出一个 NSMenu 这些 NSMenuItems 显示了一堆不同的链接 每个链接都通过 setAction 连接到目标的 openLink 方法 这种安排长
  • 嵌套 UIStackViews 打破约束

    我有一个复杂的视图层次结构 在 Interface Builder 中内置 带有嵌套的 UIStackViews 每次我隐藏一些内部堆栈视图时 我都会收到 无法满足的约束 通知 我已经追踪到这一点
  • 如何在 Swift 中更改 UIButton 图像

    我正在尝试使用 Swift 更改 UIButton 的图像 我应该怎么办 这是 OBJ C 代码 但我不知道 Swift 的情况 playButton setImage UIImage imageNamed play png forStat
  • 自调整大小的集合视图在 iOS 15 中进入递归循环

    我有一个自动调整大小的集合视图 当我调用 super layoutSubviews 时 我的应用程序崩溃 因为集合视图进入递归更新循环 这在 iOS 14 及更低版本中运行良好 但从 iOS 15 开始就观察到了这一点 class Dyna
  • Objective-C 字符串文字的预处理器宏值

    我在构建设置中定义了一个预处理器宏 FOO BAR 我想将该值转换为可以传递给方法的 Objective C 字符串文字 以下 define 不起作用 但它应该展示我想要实现的目标 define FOOLITERAL FOO want FO
  • Cocoa Accessibility API,我可以单击后台窗口而不激活它吗?

    我一直在寻找解决这个问题的方法 所以我想我应该寻找比我更伟大的头脑 我正在开发一个 Cocoa 应用程序 它使用 Accessibility API 来操作另一个程序 它是一个热键应用程序 我控制的应用程序通常会打开多个窗口 其中一些窗口隐
  • ios:如何使用 CGPath 模糊图像?

    我创建了一个 CGPath 区域 如绿色圆圈所示 CGPath区域需要清晰 图像的其余部分将应用模糊或半透明效果 我可以使用以下代码在CGPath内剪切图像 UIGraphicsBeginImageContext view frame si
  • 使用 Swift 创建 NSAlert

    我有在 Objective C 中创建和 NSAlert 的代码 但我现在想在 Swift 中创建它 该警报旨在确认用户想要删除文档 我想要 删除 按钮来运行删除功能 而 取消 按钮只是为了消除警报 我怎样才能用 Swift 写这个 NSA
  • iOS:我如何知道某个属性是否符合 KVO 标准?

    In the 键值观察编程指南 https developer apple com library archive documentation Cocoa Conceptual KeyValueObserving KeyValueObser
  • 如何生成Mac应用程序的安装包?

    如何为 OS X 二进制文件以及一些配置和脚本文件创建单个安装程序包 最终文件夹应如下所示 任何帮助 将不胜感激 谢谢 如果您希望将各种东西放置在不同的位置 安装程序在这里 文档在那里 支持文件在这里等等 它们也非常适合提供安装体验的可配置
  • 如何用Block简化回调逻辑?

    假设我需要与一个提供协议的类进行通信 并在操作完成时调用委托方法 如下所示 protocol SomeObjectDelegate required void stuffDone id anObject void stuffFailed e
  • 当自定义子视图处理触摸时防止 UITableView 滚动

    在我的 iOS 应用程序中 有一个 UITableView 其中一个单元格中包含一个自定义子视图 该单元格是一个交互式视图 它处理触摸事件 touchesBegan touchesEnded touchesMoved 以更新自身 问题是 当
  • 使用 UIKeyCommand 检测删除键

    任何人都知道如何使用检测 删除 键UIKeyCommand在 iOS 7 上 当人们在使用 Swift 时遇到问题时 我认为用 Objective C 和 Swift 编写一个小型的 完整的例子可能是一个很好的答案 请注意 Swift 没有
  • iOS 使用 NSColor 与 UIColor?

    有什么区别UIColor and NSColor 什么时候会使用每一种 我碰到NSColor在试图弄清楚的同时UIColor用于 iOS 中的属性字符串 我理解使用UIColor对于 UIKit 等 但我不认为NSColor对于这种事情确实
  • Swift:检查 UISearchBar.text 是否包含 url

    如何检查 UISearchBar text 是否包含 URL 我想做这样的事情 if searchBar text NSTextCheckingType Link 但我收到错误 String is not convertible to NS
  • WiFi 网络变化是否有 NSNotificationCenter 通知?

    我想在我的 Cocoa 应用程序中订阅 WiFi 网络更改 但我无法找到合适的事件来订阅 WiFi 网络变化是否有 NSNotificationCenter 通知 据我所知 我会用CoreWLAN https developer apple

随机推荐

  • C# 从类列表中提取字段列表

    我有某个类的元素列表 该类包含一个字段 class Foo public int i List
  • 如何从 Playground 中的 Readline 访问变量

    我面临一个挑战 需要提供两行数据 2 3 1 2 3 4 5 我必须访问这些数据并将其放入两个变量 2 和 3 中 并将第二行放入一个数组中 我认为这个挑战的一部分是阅读该行并执行以下操作 func readIntegers gt Stri
  • React Native 上的浮动操作按钮

    我想在屏幕右下角的 React Native Android 中使用浮动操作按钮 但我不能这样做 The 创建按钮组件包含浮动按钮代码 我在列表视图之后调用了 CreateButton 组件 我想在 ListView android 组件上
  • 如何在 R 中使用 if-else 条件赋值

    我有一个带有 a 列的数据框 我想根据 a 列添加不同的 b 列 For if a gt 10 b double Otherwise b single 我该怎么做 示例输出 a b 2 single 2 single 4 single 11
  • 写入 Unicode 文件

    我在 c 程序中写入 unicode 文件时遇到一些问题 我正在尝试将 unicode 日语字符串写入文件 当我去检查文件时 尽管它是空的 如果我尝试使用非 unicode 字符串 它就可以正常工作 我究竟做错了什么 setlocale L
  • 红宝石导轨包括?数组[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 是否可以检查数组内的包含数组 我想检查是否 primary 1 2 3 包括secondary 2 3 我努力了primary includ
  • Groovy 属性迭代

    在下面的 Groovy 代码中 我替换了feck arse drink实例的属性Foo与那些实例Foo2 class Foo def feck fe def arse ar def drink dr class Foo2 def feck
  • 如何将 Web 部件页面添加到站点定义?

    我必须为必须包含预定义 Web 部件页面的客户端创建站点定义 我可以创建 Web 部件页面 但在创建时将它们附加到网站时却不知所措 我知道通过 SharePoint 创建的 Web 部件页面存储在文档库中 我是否需要预先填充 Web 部件页
  • 尝试使用 JavaScript 访问使用 生成的 SVG 元素

    我正在尝试使用 JavaScript velocity js 为我定义的 SVG 制作动画
  • 如何撤消从功能分支提交到主线的更改,同时保持分支最新?

    有时 我们会遇到将功能分支提交到基线的问题 并发现在某些情况下它可能会出现严重错误 因此需要恢复更改 而不会丢失此后完成的所有其他提交 然而 需要有人继续在原来的分支上工作 我不想使用git rebase在主线上改变历史 因为这本身就会导致
  • 如何从其他 Ruby 脚本调用标准 Rakefile 中定义的 Rake 任务?

    是否可以调用在 a 中定义的任务Rakefile 不在somefile rake 来自其他 Ruby 脚本 我希望创造一个新的Rake Application会自动加载Rakefile来自同一目录 但似乎情况并非如此 这是我到目前为止想到的
  • 使用 Swift UI 自定义 macOS 工具栏

    我正在开发一个 macOS 应用程序 其视图层是用 SwiftUI 编写的 我知道 iOS 工具栏至少可以更改背景颜色 但是当我尝试在 macOS 中执行此操作时 它的行为并不符合我的预期 这是一个 简化的 示例 struct Conten
  • 如何根据 C++ 文件的输入为枚举赋值?

    我有一个文件 其值如下 开始和停止 我还声明了以下枚举 enum Type START STOP 我试图将枚举设置为等于文件中的第一个值 如下所示 enum Type foo ifstream ifile ifile open input
  • UML 领域建模

    领域模型和数据模型有什么区别 数据模型是一个design仅描述数据及其关系的模型 该模型包含实体 但它们是根据什么来描述的data他们不负责如何处理这些数据或他们的责任是什么 另一方面 领域模型是用于分析问题领域的概念模型 它用具有关系 数
  • 服务层模式——我们能否在特定情况下避免使用服务层?

    我们正在尝试使用服务层模式实现一个应用程序 因为我们的应用程序也需要连接到其他多个应用程序 并且在网络上进行谷歌搜索 我们发现了应用该模式的 正确 方式的演示图形的链接 marinfowler com 服务层模式 http martinfo
  • 第一次追加后,append_entry() 不起作用。我将 Fieldlist 与 Flask-wtf、jinja 和 Python 3.4 一起使用

    我在通过flask wtf 中的append entry 附加字段列表时遇到问题 我可以从字段列表中添加一行字段 但在添加第一行后 我无法添加第二行 没有显示错误 在第一次尝试中 添加了字段列表项的新行 并在服务器日志中打印了 数据为王 和
  • Node js 是否使用 googleapis 或 google-cloud 库

    我看到有两个可用的库 我想知道有什么区别 它们都是由 Google 官方维护的吗 https www npmjs com package googleapis https www npmjs com package googleapis h
  • 是否可以包装整数并像整数一样调用它?

    我想把 int 变成IDictionary
  • 如何将 ArrayList> 从一个活动传递到另一个活动

    我如何将数组列表从一个活动传递到另一个活动我的数组列表如下所示 ArrayList
  • 归档和取消归档导致访问错误

    我在设置模型对象以在 iPhone 的简单图形应用程序中保存用户生成的 CALayers 的视觉状态时遇到问题 我试图通过将这些属性传递给实现 NSCoding 协议的模型对象 然后传递给应用程序委托拥有的 NSMutableArray 来