- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
据我所知,在 Objective-C 中,有多种方法可以为属性(或键)设置值。如果给定属性的名称是“foo”,我主要会这样做:
[object setFoo:@"value"];
或者甚至是这样的:
object.foo = @"value";
但是,在某些情况下,我看到他们使用这个代替的代码:
[object setValue:@"value" forKey:@"foo"];
这两种方法之间的确切区别是什么(除了 Xcode 会自动为您完成第一种方法)?
另外,使用第二种方法是否安全?(setValue:forKey:)
感谢您花时间阅读这个问题。非常感谢您的帮助。
最佳答案
根据苹果官方文档,Key-Value Coding的定义如下:
键值编码是一种间接访问对象属性的机制,使用字符串来标识属性,而不是通过调用访问器方法或直接通过实例变量访问它们。
让我们通过一些简单的例子来看一下:
假设我们有一个名为 firstname 的属性,我们想将值 John 赋给它。通常,我们会在代码中编写这样的代码:
self.firstname = @"John";
或者这个:
_firstname = @"John";
很熟悉,对吧?现在,使用 KVC 机制,上面的分配看起来像下一个:
[self setValue:@"John" forKey:@"firstname"];
如果你仔细观察,这看起来类似于我们将值设置为字典的方式,或者将标量值和结构转换为 NSValue 对象时的方式。如您所见,我们为键 firstname 设置了值 John。再举一个例子:
[someObject.someProperty setText:@"This is a text"];
使用 KVC:
[self setValue:@"This is a text" forKeyPath:@"someObject.someProperty.text"];
在这两个示例中,我们不是直接将值(第一个示例)设置为属性或使用属性的 setter 方法(第二个示例),而是简单地将值与键或键路径匹配(更多关于键和键路径一会儿)。如您所想,因为我们使用键和值,所以上述技术称为键值编码。
我希望您能了解这些方法及其区别。 :)
关于ios - 设置值 :ForKey: instead of set(whatever)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35473196/
Swift 中的 CKRecord 类规范说明使用 setObject:forKey: 来设置 CKRecord 的值。但是我看到了很多带有 setValue:forKey: 的代码示例,它是 NSV
我使用 let userDefaults = UserDefaults.standard 设置了一些用户默认值,当我检索它们时,我可以使用以下任何一个: jobTextField.text = use
我正在尝试设置 NSMutableDictionary 深处的对象,我的意思是在我可以到达它们之前有几个级别的键。 显然我做不到 setObject:x forKey forKey forKey fo
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Where's the difference between setObject:forKey: and s
在查看文档时,我几乎看不出有什么大的不同。 “值”和“对象”都是 id 类型,因此可以是任何对象。 Key 曾经是一个字符串,在另一种情况下是一个 id。其中一个似乎保留了该对象,而另一个则没有。还有
由于 forKey 的值是 NSString,我在 Apple 文档中哪里可以找到所有可能值的完整列表?谢谢 最佳答案 方法 addAnimation:forKey: 并没有按照您的想法进行操作。 第
由于UIView动画是由CAAnimation支持的,所以我猜,当id执行UIView animateWithDuration:animations时,CALayer的addAnimation:for
我确信我在尝试编写的一个简单 iPhone 程序中遗漏了一些明显的东西,但代码看起来非常基本,我看不出有什么问题。 我正在尝试使用 NSMutableDictionary 来存储类列表及其关联的保存文
如果我使用dictionaryWithObjects:forKeys:,并且我的键数组恰好有重复项,会发生什么?我认为重复键的最后一个实例将是与该键关联的值;这是正确的吗? 最佳答案 The docs
我在控制台中遇到此崩溃: 2011-08-27 23:26:45.041 App[1672:3117] *** Terminating app due to uncaught exception 'N
This question already has answers here: Swift equivalent to `[NSDictionary initWithObjects: forKeys:
在我的项目中,我创建了一个包含对象和键的字典我为对象和键创建 NSArray 但是当我尝试创建字典时它会发送以下错误: * Terminating app due to uncaught except
这个问题在这里已经有了答案: Sort array into dictionary (5 个答案) 关闭 7 年前。 我有一个名为 animals 的 NSMutableArray。我需要创建一个
我对(例如)UIView 上的setValue:forKey 方法有疑问。 我有以下代码: let label = UILabel() label.layoutMargins = UIEdgeInse
在更改某些 UILabel 的框架时,我有一个神秘的 EXC_BAD_ACCESS。崩溃是随机的,通常我必须重复几分钟的条件。 启用 NSZombies 以及其他内存调试标志(NSDebugEnabl
在 Swift 中不可能使用 .setValue(..., forKey: ...) Int 之类的可空类型字段? 具有 enum 类型的属性 可空对象数组,如 [MyObject?] 对此有一种解决
我尝试使用函数 -setValue:forKey: 并使用 -valueForKey: 获取值 示例: NSArray *rootarr = [[NSArray alloc] init]; NSArr
我很好奇下面的代码片段中的 setValue:forKey: 发生了什么:它只是将指针设置为指向每个数组,类似于... [self setMyArray_1: animalArray]; [self
我的代码给出了一个错误提示 No visible interface for 'NSMutableDictionary' declares the selector 'addObjects:forKe
轨迹是这样的 Application received signal SIGSEGV Stack trace: #0 CoreFoundation 002B
我是一名优秀的程序员,十分优秀!