出现Terminating app due to uncaught exception 'NSUnknownKeyException', reason: 错误的解决方法

本文介绍了一种在iOS开发过程中常见的问题——KVC异常,并详细解释了如何通过断开无效的IBOutlet连接来解决该问题。

在编译成功但是运行时出现以下错误:

2015-11-19 23:48:27.593 BtnLabelText[1403:85125] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<BtnLabelText.ViewController 0x7f9b204473a0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key clickMe.'
*** First throw call stack:
(
0   CoreFoundation                      0x000000010acdbf45 __exceptionPreprocess + 165
1   libobjc.A.dylib                     0x000000010ca02deb objc_exception_throw + 48
2   CoreFoundation                      0x000000010acdbb89 -[NSException raise] + 9
3   Foundation                          0x000000010b0a5a6b -[NSObject(NSKeyValueCoding) setValue:forKey:] + 288
4   UIKit                               0x000000010b68504c -[UIViewController setValue:forKey:] + 88
5   UIKit                               0x000000010b8b2a71 -[UIRuntimeOutletConnection connect] + 109
6   CoreFoundation                      0x000000010ac1ca80 -[NSArray makeObjectsPerformSelector:] + 224
7   UIKit                               0x000000010b8b1454 -[UINib instantiateWithOwner:options:] + 1864
8   UIKit                               0x000000010b68bc16 -[UIViewController _loadViewFromNibNamed:bundle:] + 381
9   UIKit                               0x000000010b68c542 -[UIViewController loadView] + 178
10  UIKit                               0x000000010b68c8a0 -[UIViewController loadViewIfRequired] + 138
11  UIKit                               0x000000010b68d013 -[UIViewController view] + 27
12  UIKit                               0x000000010b56651c -[UIWindow addRootViewControllerViewIfPossible] + 61
13  UIKit                               0x000000010b566c05 -[UIWindow _setHidden:forced:] + 282
14  UIKit                               0x000000010b5784a5 -[UIWindow makeKeyAndVisible] + 42
15  UIKit                               0x000000010b4f2396 -[UIApplication _callInitializationDelegatesForMainScene:transitionContext:] + 4131
16  UIKit                               0x000000010b4f89c3 -[UIApplication _runWithMainScene:transitionContext:completion:] + 1750
17  UIKit                               0x000000010b4f5ba3 -[UIApplication workspaceDidEndTransaction:] + 188
18  FrontBoardServices                  0x000000010e8c3784 -[FBSSerialQueue _performNext] + 192
19  FrontBoardServices                  0x000000010e8c3af2 -[FBSSerialQueue _performNextFromRunLoopSource] + 45
20  CoreFoundation                      0x000000010ac08011 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
21  CoreFoundation                      0x000000010abfdf3c __CFRunLoopDoSources0 + 556
22  CoreFoundation                      0x000000010abfd3f3 __CFRunLoopRun + 867
23  CoreFoundation                      0x000000010abfce08 CFRunLoopRunSpecific + 488
24  UIKit                               0x000000010b4f54f5 -[UIApplication _run] + 402
25  UIKit                               0x000000010b4fa30d UIApplicationMain + 171
26  BtnLabelText                        0x000000010aafc51d main + 109
27  libdyld.dylib                       0x000000010d51192d start + 1
28  ???                                 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException


出现这个的原因是:之前我为按钮添加了一个变量,但是在代码中又把这个变量给删除了,此时关联还在,所以在运行时找这个变量无法找到,所以会出现错误,那么此时就是选择这个变量所在的控件对象右键单击,在弹出的菜单中看是否还存在着关联,如果存在则将此关联删除,删除方法就是单击关联哪里的x号,如下图所示:


删除之后运行正常了


### 解决iOS应用中NSUnknownKeyException异常问题 在iOS开发中,`NSUnknownKeyException` 异常通常与键值编码(Key-Value Coding, KVC)相关。当试图设置一个不存在的键值时,系统会抛出此异常。以下是对该问题的详细分析和解决方案。 #### 异常原因分析 `NSUnknownKeyException` 异常的核心原因是尝试对某个对象设置一个未定义的键值[^1]。具体到错误信息 `[ setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key KindsListName.`,它表明 `KindsListName` 并不是目标类中的有效属性或键。 #### 问题排查方法 为了解决此类问题,需要从以下几个方面进行检查: - **Interface Builder 配置**:确保在 XIB 或 Storyboard 文件中绑定的 IBOutlet 或 IBAction 的名称与代码中的声明完全一致。 - **类定义**:确认目标类是否正确实现了 `KindsListName` 属性。如果该属性不存在,则需要在类中添加对应的声明和实现。 - **拼写错误**:检查是否有拼写错误导致的键名不匹配。 #### 示例代码修复 以下是修复该问题的一个示例代码片段: ```objective-c // 确保 ViewController 类中定义了 KindsListName 属性 @interface ViewController : UIViewController @property (nonatomic, strong) NSString *KindsListName; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // 正确使用 KindsListName 属性 self.KindsListName = @"Example Value"; } @end ``` 如果 `KindsListName` 是通过 Interface Builder 绑定的 IBOutlet,则需要确保其在 Storyboard 中正确连接到对应的控件。 #### 动态键值设置的安全性改进 为了避免运行时因键值不存在而引发崩溃,可以使用 `valueForKey:` 和 `setValue:forKey:` 方法,并结合错误处理机制来增强代码的健壮性: ```objective-c // 检查键是否存在后再设置值 if ([self respondsToSelector:NSSelectorFromString(@"KindsListName")]) { [self setValue:@"New Value" forKey:@"KindsListName"]; } else { NSLog(@"Key 'KindsListName' does not exist in this class."); } ``` #### 常见问题及解决策略 - **问题:Storyboard 中的 Outlet 名称更改后仍报错** - **解决方法**:清理项目并重新构建。可以通过执行 `Product -> Clean Build Folder` 来清除旧的编译缓存[^2]。 - **问题:类名或模块名不匹配** - **解决方法**:检查 Storyboard 或 XIB 文件中指定的自定义类名是否正确,并确保其与实际实现的类名一致[^3]。 #### 总结 通过上述分析和代码示例,可以有效解决 `NSUnknownKeyException` 异常问题。关键在于确保键值的有效性和一致性,同时加强代码的健壮性以避免运行时错误
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值