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 № 1Si 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 of
NSDictionary`.
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.