Copia modificada desarrollada para ios
Primero hagamos una prueba: la imagen de arriba.
En este momento podemos ver que strongStr modificado por Strong solo quiere la dirección original, mientras que copysStr modificado por copia apunta a la nueva dirección de memoria, por lo que str cambia, strongStr cambia en consecuencia y copysStr no tiene efecto.
Por supuesto, cuando muchas personas ven una copia, pensarán en una copia profunda y una copia superficial. Escribí sobre este problema en mi último podcast y adjunté una demostración de prueba: /writer #/notebooks/24598196/Notes/42429579.
Después de comprender la copia y la copia mutable, algunas personas pueden preguntarse: ¿No se dice que el objeto inmutable de la copia es una copia superficial? Aquí, copiar modifica nsstring, que es un objeto inmutable. ¿Por qué se convirtió en una copia profunda? Debería ser copysstr, ¿debería cambiar con str?
A continuación, sigamos estudiando: la imagen de arriba.
De manera similar, copiar modifica un objeto inmutable nsstring. Aquí damos un objeto inmutable nsstring al asignar, por lo que es diferente. Primero, analice el primer párrafo. Desde una perspectiva de impresión, Str modificado con fuerza y copysStr modificado por copia apuntan a la dirección de memoria de str. Por lo tanto, el objeto inmutable copySSTR modificado por Copiar aquí se convierte en una copia superficial.
Analizando el segundo párrafo, modificamos str y vimos que la dirección de impresión de str ha cambiado. Originalmente str es una cadena inmutable, podemos modificarla, porque str = "ddd" equivale a abrir una nueva dirección de memoria, y el puntero str apunta a la dirección de ddd, en lugar de modificar la dirección de memoria original de str apuntando a hola . Luego mire hacia abajo, porque la primera prueba muestra que test.strongStr y test.copysStr son copias superficiales y aún apuntan a la dirección original de hola. La cadena que apunta a la nueva dirección no cambiará los valores de strongStr y copyStr. La dirección impresa aquí simplemente lo confirma.
¿Podemos considerar que aunque el modificador de copia modifica la propiedad, que sea una copia oscura no tiene nada que ver con el tipo de propiedad, sino con el tipo de objeto asignado?
Con esta pregunta, continuamos explorando, como arriba:
Aquí usamos copiar para modificar una matriz de variables y también asignamos una matriz de variables temparray a esta matriz. Hemos verificado en el blog anterior que todo lo que es mutable o inmutable es inmutable cuando se copia. Las copias de objetos mutables son copias profundas. Aquí observamos que self.array apunta a una nueva dirección de memoria, no a temparray, por lo que agregar nuevos elementos a temparray no afectará a self.array. Según el mensaje de error, no podemos agregar elementos a la matriz con la dirección de memoria 0x600002afbfc0, es decir. es decir, self.array es una matriz inmutable. Llegados a este punto, sólo nos queda una última pregunta. ¿Se copia self.array de temparray o array?
Siempre he creído que la práctica es el único criterio para comprobar la verdad.
Luego la imagen de arriba:
Aquí asignamos una matriz inmutable a una matriz de variables. La escritura es incorrecta, pero no afecta la depuración. A juzgar por la dirección impresa, self.array y temparray apuntan a la misma dirección 0x6000032c7700. Cuando agregamos elementos a self.array, se produce el error. En este punto, toda la verdad está clara, lo que significa que nuestra matriz modificada por copia se ha copiado ligeramente. Sabemos que cuando un objeto inmutable usa copia, solo se copia ligeramente, y luego copiamos y modificamos una matriz mutable y la asignamos a una matriz inmutable.
Por lo tanto, se demuestra que el modificador del atributo está relacionado con el tipo de objeto asignado y no tiene nada que ver con el tipo de objeto actual.
En desarrollo, muchas veces asignamos tipos de valores a los objetos que definimos, pensando erróneamente que los modificadores solo están relacionados con el tipo de propiedad actual.
¿Cuál es la pregunta final? De hecho, ya sea que se trate de una verificación de cadenas o de matrices en este momento, el problema radica en la sintaxis. Sabemos que sefl.array en realidad toma el método de asignación set (_array = array). Array es el puntero pasado por temparray como parámetro, por lo que la asignación del método set en realidad copia un puntero de temparray. La creación de una nueva dirección de memoria depende del tipo de matriz temporal.
Aquí podemos explicar por qué nsstring a menudo usa copiar, porque al modificar la copia, cuando a nuestro atributo se le asigna una cadena variable, se copiará profundamente en una cadena inmutable, de modo que incluso si la cadena original cambia. , no afectará los valores de nuestros atributos, asegurando la estabilidad de los atributos.
Si especifica una cadena inmutable, resulta ser una copia superficial. Las cadenas inmutables no se pueden cambiar, por lo que str = @"DDD" anterior parece haber cambiado. De hecho, para cadenas inmutables, escribir así significa abrir una nueva dirección de memoria, STR apunta a la nueva dirección y nuestra copyStr aún apunta a la dirección original, que no será destruida ni modificada, y los atributos también son estabilidad garantizada.