Pregunta

Recientemente, mientras tratando de responder a las preguntas aquí, me encontré con algo de código de prueba para ver cómo Xcode / GDB informó la clase de instancias en grupos de clase . (Ver más abajo) En el pasado, he esperado a ver algo como:

PrivateClusterClass:PublicSuperClass:NSObject

como este (que todavía devuelve como se espera):

NSPathStore2:NSString:NSObject

... para una cadena creada con +[NSString pathWithComponents:].

Sin embargo, con NSSet y subclase el código siguiente:

- (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);
}

... Salidas:

// 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

El depurador muestra la misma clase para todas las instancias Set. Sé que en el pasado, el clúster de conjunto de la clase no arrojó como este.

  1. ¿Qué ha cambiado? (Sospecho que se trata de un cambio en el puente de la Fundación Core.)
  2. ¿Qué informe de conglomerados de clases sólo una clase genérica, por ejemplo, NSCFSet y que informan de un subclase real, por ejemplo, NSPathStore2?
  3. Lo más importante, al depurar, ¿cómo determinar la clase real de una instancia de clúster NSSet?
¿Fue útil?

Solución

  1. Un detalle de implementación modificados los más probable en relación con el puente de CF. Si se mira de cerca, verá que un grupo de la ejecución de Objective-C copias de diversas clases Fundación ahora se puede encontrar en CoreFoundation.

  2. Otro detalle de implementación. La implementación de la Fundación cambio racimos de clase - a veces en gran medida, a veces de manera sutil - con cada nueva versión de Mac OS X. El conjunto exacto de las clases particulares relacionadas con dicha aplicación es generalmente consecuencias de lo particular, conjunto de requisitos eran necesarios para lograr una flexibilidad y una solución razonablemente óptima al mismo tiempo preservar el contrato API del público frente a las clases.

  3. NSCFSet es la clase real. Las características de los casos son determinados por cómo se asignan en primer lugar. No hay manera expuesta para determinar si el conjunto es mutable o inmutable. Esto es en realidad el propósito; va por el camino de la escritura de una gran cantidad de código que cambia el comportamiento basado en la mutabilidad de un grupo de clases conduce a la locura.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top