/ / Si almacenamos un NSMutableDictionary en un NSDictionary, ¿podemos usarlo nuevamente como NSMutableDictionary? - ios, objectivo-c, nsdictionary, nsmutabledictionary

Si almacenamos un NSMutableDictionary en un NSDictionary, ¿podemos usarlo más tarde como un NSMutableDictionary? - ios, object-c, nsdictionary, nsmutabledictionary

Si reemplazamos una variable de instancia NSDictionary con un NSMutableDictionary que creamos, ¿podemos usarlo nuevamente como NSMutableDictionary convirtiéndolo como NSDictionary?

Ejemplo:

crear y almacenar NSMutableDictionary en la ranura NSDictionary

NSMutableDictionary *muta = [[NSMutableDictionary alloc] initWithObjects:NSArray forKeys:NSArray];
Object.nsDictionary = muta;

Obtén el diccionario más tarde

NSMutableDictionary *muta2 = (NSMutableDictionary*) Object.nsDictionary;
//Do stuff like Add objects with it
[muta2 setObject:id forKey@"key"];

¿Tenemos que recrear un NSMutableDictionary deel NSDictionary que extraemos del objeto o lo retiene "s" mutabilidad? ¿Puede decirme por qué un objeto subclasificado conservará o no sus métodos y propiedades específicos al reemplazar una superclase genérica?

Respuestas

3 para la respuesta № 1

Si su propiedad se declara como NSDictionary entonces no debe hacer ninguna suposición sobre si es realmente mutable o no.

El código apropiado debería ser:

NSMutableDictionary *muta2 = [Object.nsDictionary mutableCopy];

Esto funciona independientemente de qué tipo de diccionario esté realmente almacenado en la propiedad.


0 para la respuesta № 2

En su pregunta, está confundiendo dos cosas diferentes: se refiere a asignar a un Instancia variable pero muestra el código que muestra la asignación a un propiedad. Estos no son lo mismo. También pareces estar malentendido asignación refiriéndose a él como reemplazando un objeto.

En Objective-C (y muchos otros lenguajes, pero no todos) un objeto es referido por un referencia. Son estas referencias las que son asignado en variables. Entonces, por ejemplo en:

NSMutableDictionary *a = [NSMutableDictionary new];
NSMutableDictionary *b = a;

El lado derecho de la primera asignación es una expresión que crea un nuevo objeto y devuelve una referencia a ese objeto. Esta referencia se almacena en la variable a. La segunda línea copia el referencia, no el objeto, almacenado en a y se almacena en la variable b.

Después de estas dos líneas, se han creado un objeto y dos variables, y ambas variables hacen referencia exactamente lo mismo objeto. Asignación de una referencia a un objeto. no cambia el objeto al que se refiere. Entonces, si ahora cambiamos el código a:

NSMutableDictionary *a = [NSMutableDictionary new];
NSDictionary *b = a;

Todavía tenemos un objeto y dos variables creadas, y ambas todavía se refieren exactamente al mismo objeto. La asignación en este caso está permitida como NSMutableDictionary es un subclase de NSDictionary - ese es un objeto de tipo NSMutableDictionary también es de tipo NSDictionary, proporciona el mismo comportamiento que este último.

De su pregunta "¿Puede decirme por qué un objeto subclasificado conservará o no sus métodos y propiedades específicos al reemplazar una superclase genérica?" necesitas leer sobre herencia y entender cómo funciona la subclase.

Una vez que haya almacenado una referencia a una subclase en una superclase de variables escritas, a dentro b en el código anterior, mientras no ha cambiado elobjeto referenciado de todos modos, ha perdido el conocimiento inmediato de que la referencia es de hecho a un objeto de la subclase: todo lo que puede decir inmediatamente sobre una referencia almacenada en b arriba es que se refiere a un objeto que es al menos un NSDictionary, pero mayo ser de cualquier subclase de NSDictionary.

Si usted es absolutamente seguro, o simplemente como escribir programas que se rompen, puedes decirle al compilador que confíe en ti b contiene una referencia a un NSMutableDictionary usando un emitir:

NSMutableDictionary *c = (NSMutableDictionary *)b;

Haga esto y el compilador confía en usted, pero si b no contiene una referencia a un NSMutableDictionary entonces su uso posterior de c probablemente no será válido y su programa se romperá.

Lo que debe hacer es probar si la referencia se refiere a un NSMutableDictionary o no, y lo haces con el método isKindOfClass::

if ([b isKindOfClass:NSMutableDictionary.class])
{
// b refers to an NSMutableDictionary
NSMutableDictionary *c = (NSMutableDictionary *)b;
// do something with c
}
else
{
// b does not refer to an NSMutableDictionary
// handle this case
}

De regreso propiedades: una propiedad es dos métodos (suponiendo que lectura-escritura, puede tener propiedades de solo lectura), un adquiridor y un setter, que se combinan para proporcionar una abstracción de un variable - puedes "leer" y "asignarles" usando puntonotación en expresiones. Sin embargo, como llaman a un método, en lugar de realizar lecturas directas o asignaciones a una variable, ese método puede cambiar si se lee o se asigna. En particular, una propiedad de tipo objeto declarada con dupdo El atributo hará una copia del objeto Eso es referencia. Por ejemplo:

@property (copy) NSDictionary *c;

...

NSMutableDictionary *a = [NSMutableDictionary new];
NSDictionary *b = a;
self.c = a;

entonces a & b ambos se refieren a mismo objeto que es una instancia de NSMutableDictionary; mientras, debido a la copy atributo,dorefers to a *distinct* object which is an instance ofNSDictionary`.

Ahora puede ver por qué usar Instancia variable y propiedad indistintamente en su pregunta no es correcto: lo que se asigna puede ser diferente dependiendo de si la asignación es a una variable o una propiedad.

Debe leer sobre objetos, referencias de objetos, herencia y propiedades.

HTH.