Objective-C对象typedef产生奇怪的@encode并打破KVC

请考虑以下代码
#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二进制兼容的bug.我希望这种事情最终会逐步取消,以支持正确的编译器.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...