¿Cuál es la diferencia entre dos fragmentos?Diferencia entre la versión y la versión luego configurada como nula
[myObj release];
y
[myObj release];
myObj = nil;
¿Cuál es la diferencia entre dos fragmentos?Diferencia entre la versión y la versión luego configurada como nula
[myObj release];
y
[myObj release];
myObj = nil;
Si acaba de liberar un objeto, se convertirá en objeto liberado.
Y si intenta realizar cualquier tipo de operación en un objeto liberado, su aplicación se bloquea. Para evitar tales accidentes, siempre se prefiere "asignar su objeto a cero después de soltarlo". Porque todos sabemos que las operaciones realizadas en nil no se ejecutarán :)
No mucho. La segunda forma solo evita que accidentalmente intentes reutilizar la memoria como si todavía fuera un objeto. (Como si fuera el mismo objeto , la dirección de la memoria es probable que se reutilice para un nuevo objeto poco después).
Tiene que tener cuidado con el primero, porque después de su lanzamiento, el puntero aún apunta a alguna memoria con guardapolvos y puede contener algún otro objeto. Entonces, en el primero, si prueba [myObj release] y luego [myObj doSomething], la aplicación puede fallar
Mi consejo es que siempre debe establecerlo en cero después de su lanzamiento.
al llamar la liberación en el objeto, el recuento de referencias disminuye. al llamar retener el recuento de referencia se incrementa.
Así como los chicos mencionaron el puntero aún señalará el mismo lugar.
Es un gran problema en la administración de la memoria. Si está utilizando una propiedad, puede usar nil sin usar la versión. Debido a que el método de selección de una propiedad funciona de la siguiente manera:
- (void)setObjTypes:(NSArray *)ObjTypes {
[ObjTypes retain];
[_ObjTypes release];
_ObjTypes = ObjTypes;
}
Los emisores de aumentar el número de referencia del pasado variable interna, disminuir el número de referencia de la variable de instancia de edad, y luego establecer la variable de instancia en el pasado -en variable De esta forma, el objeto tiene un recuento de referencia para el objeto almacenado en la variable de instancia siempre que se establezca.
El método setter aplica automáticamente el método de liberación y luego establece el valor de la variable de instancia con nil. Pero si no está utilizando una propiedad, es una gran experiencia que antes de configurar nada tengamos que establecer primero la liberación. Si establecemos un puntero a nil, significa que no apunta a ninguna dirección de memoria, de modo que si tratamos de acceder a esa memoria usando arriba puntero entonces se bloqueará. Y si llamamos al método de lanzamiento en una variable de instancia, libera la memoria.
Además: cuando utiliza un setter sintetizado, no necesita liberar primero y luego establecerlo en nil. Configuración en cero también se liberará automáticamente. – Rengers
Solo para destacar, si liberas un objeto, puede que no se libere ... muy a menudo algo funcionará durante un tiempo, pero se bloqueará misteriosamente más tarde. –