gpt4 book ai didi

objective-c - 为什么setValue :forKey: fail on a 32-bit system but not 64-bit?

转载 作者:搜寻专家 更新时间:2023-10-31 08:23:26 24 4
gpt4 key购买 nike

我最近向 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 的性质以及它是否是 charbool ,正如评论所暗示的那样——这取决于许多因素(来自在 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在传递的任何对象上。

如果BOOLchar它叫- charValue , 和 NSString没有这样的方法 - 所以失败。

如果BOOLbool它叫- 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com