- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
考虑以下代码:
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
typedef NSString* MyStringRef;
typedef NSString MyString;
@interface ClassA : NSObject
@property (nonatomic, copy) MyStringRef stringA;
@property (nonatomic, copy) MyString *stringB;
@end
@implementation ClassA
@synthesize stringA = _stringA;
@synthesize stringB = _stringB;
@end
int main() {
unsigned int count = 0;
Ivar *ivars = class_copyIvarList([ClassA class], &count);
for (unsigned int i = 0; i < count; i++) {
Ivar thisIvar = ivars[i];
NSLog(@"thisIvar = %s, %s", ivar_getName(thisIvar), ivar_getTypeEncoding(thisIvar));
}
ClassA *a = [[ClassA alloc] init];
NSLog(@"Out: %@", [a valueForKey:@"stringA"]);
NSLog(@"Out: %@", [a valueForKey:@"stringB"]);
}
这是输出:
$ clang --version
Apple clang version 3.1 (tags/Apple/clang-318.0.58) (based on LLVM 3.1svn)
Target: x86_64-apple-darwin11.4.0
Thread model: posix
$ clang -o typedef -fobjc-arc -framework Foundation typedef.m && ./typedef
2012-06-06 20:14:15.881 typedef[37282:707] thisIvar = _stringA, @"NSString"
2012-06-06 20:14:15.884 typedef[37282:707] thisIvar = _stringB, ^{NSString=#}
2012-06-06 20:14:15.885 typedef[37282:707] Out: (null)
2012-06-06 20:14:15.888 typedef[37282:707] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<ClassA 0x7fabe0501480> valueForUndefinedKey:]: this class is not key value coding-compliant for the key stringB.'
*** First throw call stack:
(
0 CoreFoundation 0x00007fff835fef56 __exceptionPreprocess + 198
1 libobjc.A.dylib 0x00007fff878e5d5e objc_exception_throw + 43
2 CoreFoundation 0x00007fff836891b9 -[NSException raise] + 9
3 Foundation 0x00007fff83e77703 -[NSObject(NSKeyValueCoding) valueForUndefinedKey:] + 240
4 Foundation 0x00007fff83dae38e _NSGetUsingKeyValueGetter + 108
5 Foundation 0x00007fff83dae315 -[NSObject(NSKeyValueCoding) valueForKey:] + 392
6 typedef 0x000000010e84bc6d main + 317
7 typedef 0x000000010e84b9c4 start + 52
)
我的问题是 Objective-C 是什么导致 typedef NSString MyString
有效地创建一个包含一个 Class
类型变量的结构,然后在我使用 MyString
的地方使用它。例如结构看起来像这样(在咨询 this 之后):
struct NSString {
Class a;
};
这有点道理,但会导致 valueForKey:
失败,大概是因为它现在是一个结构,所以它不能以与对象相同的方式返回它。或者更准确地说,它属于搜索顺序described in the docs的“抛出异常”部分。 .
我只是想了解导致这种情况发生的语言是什么,以及为什么它不能以相同的方式处理我的 2 个 typedef。
最佳答案
我在 WWDC 2012 上得到了答案。事实证明,这种行为是预期的,因为与 GCC 的二进制兼容性也是如此。
对我来说似乎很奇怪,他们有效地引入了我认为是与旧 GCC 二进制兼容的错误。我希望这种事情最终会被淘汰,取而代之的是正确的编译器。
关于Objective-C 对象 typedef 产生奇怪的 @encode 并破坏 KVC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10920781/
我在我的代码中使用了 kvc。 [self addObserver:self forKeyPath:@"type" options:NSKeyValueObservingOptionNew |
@interface MyClass: NSObject @property NSArray *arr; @end @inplementation MyClass - (instancetype) i
作为 Cocoa 和 Objective-C 的新手,我对 KVC 和 KVO 有初步的了解。然而,关于 Cocoa 绑定(bind)(如标题为“Cocoa 绑定(bind)编程主题”的 Apple
我有一组从核心数据中选择的对象。我需要从这组对象子集中选择与条件相对应的对象。怎么做? 最佳答案 如果我没理解错的话,您想根据数组中某些对象满足的条件来过滤数组吗? 您可以通过使用 NSPredica
我创建类: @interface KVOGame : NSObject @property (nonatomic, strong) NSString *name; @property (nonatom
我有一个可绑定(bind)协议(protocol) protocol Bindable: class { associatedtype ObjectType: Any associat
以下哪个更快,为什么? CGFloat sum = 0; for (UIView *v in self.subviews) sum += v.frame.size.height; 或 CGFl
如果接收器类符合 NSKeyValueProtocol,则可以选择走很远的路: [myInstance setValue:[NSNumber numberWithInt:2] forKey:@"int
我经常需要检索属于 Set 的第一个对象。 (使用该对象作为该集合的代表。) 我设想了一个集合对象运算符,类似于 @unionOfObjects 但是很明显 @firstObject 是否可以创建这样
我正在尝试让我的头脑专注于“键值编码”。 Apple's docs say: This document describes the NSKeyValueCoding informal protoco
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 4 年前。 Improve this ques
我正在尝试向我的可重用单元添加一个观察者,问题是它添加了多个观察者。所以我想知道是否有什么办法可以解决这个问题,因为我真的需要这个观察者。 var player: AVPlayer? var post
我想解析 XML 以填充符合 KVC 的对象,但是,我的解析器非常笨,它只是从 XML 属性/标签组装 NSStrings 并尝试通过 KVC 设置它们。 这适用于实际的字符串和数字(我相信),但
我正在尝试观察收藏笔记。这是代码: -(void) registerNotesHeaderViewChangeNotification { [self.selectedVegetableGar
我使用此代码通过我的可变数组订阅事件: [RACObserve(self, marray) subscribeNext:^.... 我是 RAC 的新手,我不明白为什么,例如,如果我使用: NSMut
我有例如我的 NSArray 中有 5 个 MyFile 对象。这 5 个对象中的每一个都具有属性 path。 MyFile *myFile ...; NSString path = myMyFile
这是代码: NSNumber *taskId = [[self.taskList objectAtIndex:indexPath.row] valueForKey:@"identity"]; N
有一个例子如下: enum Gender{ case male case female } class Person:NSObject{ var name: String?
我正在尝试了解 Swift 4 的最新添加 - better KVC .在 Playground 上放这个简单的东西什么也打印不出来 class Foo { var name: String
我读过Marcus S. Zarra的iOS相关章节Core Data: Data Storage and Management for iOS, OS X, and iCloud (第 2 版)受益
我是一名优秀的程序员,十分优秀!