目標-C:クラスクラスタ内のクラスの真のクラスを取得する
-
27-09-2019 - |
質問
最近、ここで質問に答えようとして、Xcode/gdb がインスタンスのクラスをどのように報告するかを確認するためにいくつかのテストコードを実行しました。 クラスクラスタ. 。(以下を参照) 以前は、次のようなものを期待していました。
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 クラス クラスターがこのように返されなかったことは知っています。
- 変化したこと?(Core Foundation からのブリッジの変更ではないかと思います。)
- どのクラスクラスターが単に汎用クラスを報告するか。NSCFSet と実際のサブクラスをレポートします。NSPathStore2?
- 最も重要なのは、デバッグ時に NSSet クラスター インスタンスの実際のクラスをどのように判断するかということです。
解決
実装の詳細は、おそらく CF へのブリッジに関連して変更されました。よく見ると、さまざまな Foundation クラスをサポートする多数の Objective-C 実装が CoreFoundation にあることがわかります。
別の実装の詳細。Foundation クラス クラスタの実装は、Mac OS X のリリースごとに、時には大きく、時には微妙に変化します。上記の実装に関連するプライベート クラスの正確なセットは、通常、公開クラスの API コントラクトを維持しながら、柔軟で適度に最適なソリューションを達成するために必要な特定の要件セットから派生したものです。
NSCFセット は 実際のクラス。インスタンスの機能は、最初にインスタンスをどのように割り当てたかによって決まります。セットが変更可能か不変更かを判断する公開された方法はありません。これは実際には意図的なものです。クラス クラスターの可変性に基づいて動作を変更するコードを大量に記述するという道をたどると、狂気の沙汰につながります。