iphone - Objective-C:获取类簇中类的真实类

标签 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. 实现细节的更改很可能与 CF 桥接相关。如果仔细观察,您会发现现在可以在 CoreFoundation 中找到一堆支持各种 Foundation 类的 Objective-C 实现。

  2. 另一个实现细节。基础类簇的实现随着 Mac OS X 的每次发布而发生变化——有时很大,有时很微妙。与所述实现相关的私有(private)类的确切集合通常是由实现灵活的系统所需的任何特定需求集决定的。合理的最佳解决方案,同时还保留面向公众的类的 API 契约。

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

关于iphone - Objective-C:获取类簇中类的真实类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2840972/

相关文章:

iphone - 为 UIImage 制作圆角

ios - 如何在不被打扰的情况下在后台循环播放声音?

objective-c - 在任务控制中将窗口移动到新空间

cocoa - 以编程方式强制 Spotlight 为特定不可见文件类型的元数据建立索引

javascript - 将包含 NSDictionary 对象的 NSArray 传递给 Javascript 函数

ios - 在点击 UILabel(手势识别器)时,在一个单元格的 tableview 原型(prototype)单元格中找到 nil 并且它在另外两个单元格中工作正常

ios - 不再使用时从 UITableViewCell 中移除观察者

objective-c - 解析 UILabel

objective-c - Swift 和 Objective C 委托(delegate)调用 - 数据类型问题

iphone - 你能帮我理解 cocoa/objective-c 中的保留计数吗?