【问题标题】:Objective-C: Getting the True Class of Classes in Class ClustersObjective-C:在类簇中获取类的真实类
【发布时间】:2010-05-15 17:07:33
【问题描述】:

最近在尝试在这里回答一个问题时,我运行了一些测试代码来查看 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 集群实例的实际类?

【问题讨论】:

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


    【解决方案1】:
    1. 实现细节的更改很可能与桥接 CF 相关。如果您仔细观察,您会发现现在可以在 CoreFoundation 中找到大量支持各种 Foundation 类的 Objective-C 实现。

    2. 另一个实现细节。 Foundation 类集群的实现会随着 Mac OS X 的每个版本而变化——有时很大,有时很微妙。与上述实现相关的私有类的确切集合通常是从实现灵活所需的任何特定要求集的结果中得出的。和合理的最佳解决方案,同时还保留面向公众的类的 API 合同。

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

    【讨论】:

    • 我的想法差不多。当您不确定他们是否按照应有的方式进行初始化时,它会使调试其他人的代码成为一种挑战。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多