- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我最近向 Apple 提交了一份关于此的错误报告,但我想无论如何我都会问这个问题,以防我遗漏一些明显的东西。在 Objective-C 中,以下调用在 64 位系统上运行良好,但在 32 位系统上抛出 NSInvalidArgumentException:
[self setValue:@"true" forKey:@"flag"];
“标志”属性是一个 bool 值:
@property BOOL flag;
此外,该调用在 Swift/32 位中运行良好,其中属性是 Bool:
var flag: Bool = false
类似地,此调用在 64 位系统上的 Swift 中运行良好,但在 32 位系统上抛出 NSInvalidArgumentException(“index”是一个 Int):
setValue("2", forKey: "index")
但它在 Objective-C/32 位中运行良好,其中属性是一个 NSInteger。
无论语言或处理器架构如何,我都希望这些调用能够正常工作。有没有人知道他们为什么不这样做?
最佳答案
如果你把它们全部结合起来,答案就在评论中......
setValue:forKey:
不需要NSNumber
吗/NSValue
对于基本类型的属性,但您通常会传递一个。
观察到的问题也没有下降到 64 位和 32 位,示例代码也可能在 64 位系统上失败。
这完全取决于 BOOL
的性质以及它是否是 char
或 bool
,正如评论所暗示的那样——这取决于许多因素(来自在 10.10.5 上运行的 Xcode 6.4):
/// Type to represent a boolean value.
#if !defined(OBJC_HIDE_64) && TARGET_OS_IPHONE && __LP64__
typedef bool BOOL;
#else
typedef signed char BOOL;
// BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C"
// even if -funsigned-char is used.
#endif
setValue:forKey
当设置
- <type>Value
在传递的任何对象上。
如果BOOL
是 char
它叫- charValue
, 和 NSString
没有这样的方法 - 所以失败。
如果BOOL
是bool
它叫- boolValue
, 和 NSString
有那个所以一切都很好。
简单修复:
@property bool flag;
这应该适用于任何地方并且有额外的好处 flag
总是是真/假、是/否、1/0,而不是 char
的其他 254 种可能性之一可以。
试想一下,如果 C 语言的设计者不吝啬并从一开始就包含一个真正的 bool 类型,事情会有多么不同......
关于objective-c - 为什么setValue :forKey: fail on a 32-bit system but not 64-bit?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32145384/
我正在为 Mac OS X 编写程序,遇到以下问题: 在我的一个类中,有许多 bool 属性,可以使用 KVO 访问这些属性(即通过 valueForKey: 和 setValue:forKey: 方
我正在创建一个带有页面对象文件 (login.po.js) 和测试规范文件 (test.spec.js) 的 webdriver.io 自动化,但是当我调用它时它似乎无法识别该对象测试规范文件 (te
我正在尝试使用 setValue() 方法将数据保存到我的实时数据库,但它没有保存我的对象。 我尝试了一个简单的字符串,但仍然没有成功。 我的代码: FirebaseDatabase db =
我一直在谷歌应用程序脚本上为工作表编码: function basePesa(){ var sheet = SpreadsheetApp.getActiveSpreadsheet().getSh
FinalViewWithSending *newView = [[FinalViewWithSending alloc]initWithNibName:@"FinalViewWithSending"
我创建了一个自动完成和一个选项组件,当我们在输入字段中键入搜索短语时,我调用网络服务并获取数据,然后在选项组件中显示列表,但是当我从该列表中选择一个选项并将值设置为输入字段,然后 Web 服务将再次触
电子表格的 Google-apps 脚本 我有一个可变长度的对象数组。 [{}, {}]我使用 for 循环 (i=0; i
我有以下带有MutableLiveData data的ViewModel和另一个从ones派生的LiveData data,其方式是仅当data.number等于1时才更新其值。 class Dumm
我在 Mac OS X 10.6.8、wxPython 2.9.3.1 和 64 位 Python v2.7.2 下运行以下代码: import wx class MyFrame(wx.Frame):
我会在他注册时将用户数据保存到 firebase,但是有一个问题,如果他创建了 Auth 帐户然后在保存他的信息之前失去了连接,这意味着他将得到没有任何个人资料信息的电子邮件\密码。 所以问题是如果他
我创建了一个自动完成和一个选项组件,当我们在输入字段中键入搜索短语时,我调用网络服务并获取数据,然后在选项组件中显示列表,但是当我从该列表中选择一个选项并将值设置为输入字段,然后 Web 服务将再次触
我们目前有一个按钮,第一次按下时会添加一个节点,如下/Users/UID/Interests/childByAutoID/"value",再次按下时会删除该节点上的值。第一次单击按钮时,值将添加到节点
我在使用 Swift 编写的 iOS 应用程序中使用 Firebase。 static func createUserRecord(uid: String, user: User){
大家好,我是 swift 的新手,在我的应用程序中,我声明了一个这样的字典: var imageDict : Dictionary = [:] 我想像这样为该字典设置值: imageDict.setV
我已经使用代码创建了RadioGroup var radios = new Ext.form.RadioGroup({ columns : 2, items: [
这个问题已经有答案了: Xcode - How to fix 'NSUnknownKeyException', Reason: "… this class is not key value codin
如何使用 RTTI 设置枚举字段的值? 即 type TCPIFileStatus= (fsUnknown, fsProcessed); TTest = class FStatus:
我帮助维护一个 Google 电子表格,其中通过 HTML 表单添加新数据。 添加新数据时,新数据的插入点取决于表单字段之一(申请接收日期)。 该脚本查找工作表中应插入数据的位置并执行 3 件事: 在
我正在编写的程序使用许多注册表项来存储一些重要信息。为了确保程序的第一个方法中存在所有注册表项,我测试注册表项是否存在,如果不存在则创建它们并使用默认值。 这是我的代码: RegistryKey R
我正在学习 Extjs 并遇到问题,当我尝试将新文本附加到项目时,我收到错误 tf.setValue 不是函数 getValue 也是如此。当我尝试 setVisible 时,它的工作原理应该是这
我是一名优秀的程序员,十分优秀!