Objective-C:在类集群中获得真正的类

时间:2010-05-15 17:07:33

标签: iphone objective-c cocoa foundation core-foundation

最近在尝试回答问题时,我运行了一些测试代码,以了解Xcode / gdb如何在class clusters中报告实例类。 (见下文)在过去,我希望看到类似的东西:

PrivateClusterClass:PublicSuperClass:NSObject

如此(仍按预期返回):

NSPathStore2:NSString:NSObject

...表示使用+[NSString pathWithComponents:]创建的字符串。

但是,使用NSSet和子类代码如下:

- (void)applicationDidFinishLaunching:(UIApplication *)application {    
    NSSet *s=[NSSet setWithObject:@"setWithObject"];
    NSMutableSet *m=[NSMutableSet setWithCapacity:1];
    [m addObject:@"Added String"];
    NSMutableSet *n = [[NSMutableSet alloc] initWithCapacity:1];
    [self showSuperClasses:s];
    [self showSuperClasses:m];
    [self showSuperClasses:n];
    [self showSuperClasses:@"Steve"];   
}

- (void) showSuperClasses:(id) anObject{
    Class cl = [anObject class];
    NSString *classDescription = [cl description];
    while ([cl superclass]) 
    {
        cl = [cl superclass];
        classDescription = [classDescription stringByAppendingFormat:@":%@", [cl description]];
    }
    NSLog(@"%@ classes=%@",[anObject class], classDescription);
}

......输出:

// NSSet *s
NSCFSet classes=NSCFSet:NSMutableSet:NSSet:NSObject
//NSMutableSet *m
NSCFSet classes=NSCFSet:NSMutableSet:NSSet:NSObject
//NSMutableSet *n
NSCFSet classes=NSCFSet:NSMutableSet:NSSet:NSObject
// NSString @"Steve"
NSCFString classes=NSCFString:NSMutableString:NSString:NSObject

调试器为所有Set实例显示相同的类。我知道在过去,Set类集群没有像这样返回。

  1. 发生了什么变化? (我怀疑这是Core Foundation的桥梁改变。)
  2. 什么类群集仅报告通用类,例如NSCFSet,它报告一个实际的子类,例如NSPathStore2?
  3. 最重要的是,在调试时如何确定NSSet集群实例的实际类?

1 个答案:

答案 0 :(得分:3)

  1. 实施细节的变化很可能与CF的桥接有关。如果仔细观察,您会发现现在可以在CoreFoundation中找到支持各种Foundation类的一堆Objective-C实现。

  2. 另一个实现细节。基础类集群的实现随着Mac OS X的每个版本的变化而变化 - 有时很大,有时是微妙的。与所述实现相关的私有类的确切集合通常是因为实现灵活性所需的任何特定需求集的影响。和合理的最佳解决方案,同时还保留了面向公众的类的API合同。

  3. NSCFSet 实际的类。实例的功能取决于您首先分配它的方式。没有公开的方法来确定您的集合是可变的还是不可变的。这实际上是故意的;沿着编写大量基于类集群的可变性改变行为的代码的路径导致疯狂。