iphone - files - enviado a instancia desasignada
nfc iphone 8 (7)
¡Rastreando qué vista es realmente útil! Puede ser bastante trivial si conoce el marco y qué superlayers y subcapas están relacionados con esa vista ... Si registra todas las capas es solo para buscar y encontrar la misma dirección de memoria. ¡Buena suerte! :)
Añade esta categoría a tu aplicación
Encabezado de categoría:
#import "CALayer+debug.h"
@interface CALayer (Debug)
-(NSString*)debugDescription;
-(NSString*)debugLayerTree;
@end
Categoría-Implementación:
#import <Foundation/Foundation.h>
#import <QuartzCore/QuartzCore.h>
#import "CALayer+debug.h"
#import <UIKit/UIKit.h>
#import <objc/runtime.h>
#import <objc/message.h>
@implementation CALayer (Debug)
//....
void Swizzle(Class c, SEL orig, SEL new)
{
Method origMethod = class_getInstanceMethod(c, orig);
Method newMethod = class_getInstanceMethod(c, new);
if(class_addMethod(c, orig, method_getImplementation(newMethod), method_getTypeEncoding(newMethod)))
class_replaceMethod(c, new, method_getImplementation(origMethod), method_getTypeEncoding(origMethod));
else
method_exchangeImplementations(origMethod, newMethod);
}
+ (void)swizzle {
Swizzle([self class], @selector(init), @selector(newInit));
}
- (id)newInit {
self = [self newInit];
[self performSelector:@selector(log) withObject:self afterDelay:0.5];
return self; // calls old method
}
- (void)log {
NSLog(@"%@", [self debugDescription]);
}
- (NSString *)debugDescription {
return [NSString stringWithFormat:@"%@ frame=%@ zAnchor=%1.1f, superlayer: %@>", [self description], NSStringFromCGRect(self.frame), self.zPosition, self.superlayer];
}
@end
Llamar desde, por ejemplo, appdelegate
[CALayer swizzle];
Cada vez que presiono un controlador de vista en mi pila, luego lo saco, aparece este error:
*** -[CALayer retainCount]: message sent to deallocated instance <memory address>
Parece que ocurre justo después de que se llama a dealloc
en el controlador de vista que se está extrayendo y es exclusivo solo de este controlador de vista. Estoy seguro de que CALayer tiene algo que ver con la vista en sí misma, ya que no los uso.
¿Algunas ideas?
Edit: Aquí está el backtrace
(gdb) bt
#0 0x01fcd3a7 in ___forwarding___ ()
#1 0x01fa96c2 in __forwarding_prep_0___ ()
#2 0x01fc10e8 in CFGetRetainCount ()
#3 0x01cbc770 in CA::release_root_if_unused ()
#4 0x01cbc707 in x_hash_table_remove_if ()
#5 0x01cbc4ec in CA::Transaction::commit ()
#6 0x01cc4838 in CA::Transaction::observer_callback ()
#7 0x01fa5252 in __CFRunLoopDoObservers ()
#8 0x01fa465f in CFRunLoopRunSpecific ()
#9 0x01fa3c48 in CFRunLoopRunInMode ()
#10 0x027dd615 in GSEventRunModal ()
#11 0x027dd6da in GSEventRun ()
#12 0x0057cfaf in UIApplicationMain ()
#13 0x00002dec in main (argc=1, argv=0xbfffeed0)
Estaba recibiendo el mismo error. Hice un objeto UIView
para mantener dos botones, que luego agregué al elemento de rightBarButtonItem
mi elemento de rightBarButtonItem
. El problema es que utilicé el método buttonWithType
para crear los botones, pero simplemente alloc
e initWithFrame
mi vista. Luego, cuando terminé con la vista, la estaba liberando y, más tarde, cuando el sistema intentaba liberar los dos botones (subvistas de la UIView
ya lanzada) - crash - Estaba enviando un mensaje a los botones ya liberados. Espero que esto ayude a alguien a ahorrar algo de tiempo en problemas similares.
Esto es un poco complicado, el mío fue un lanzamiento doble en una función dealloc de una de las clases (m / xib) que tuve en una vista de tabla como un estilo de fila. Los instrumentos no mostraron mucho sobre el objeto, pero verificar la pila de llamadas fue realmente útil para señalar qué clase era la que iba a -1.
Tengo una sospecha de que tiene que ver con el grupo de liberación automática ...
Tuve el mismo error y fue porque creé un UIButton utilizando buttonWithType
(por ejemplo, [UIButton buttonWithType:UIButtonTypeRoundedRect]
) y lo [UIButton buttonWithType:UIButtonTypeRoundedRect]
después. Esto fue incorrecto porque buttonWithType
ya tiene un autorelease
incluido. Así que quité mi release
y el error desapareció.
Tuve un problema similar Mi problema fue que una de las variables de objeto declaradas en la interfaz se declaró erróneamente con (nonatomic, assign)
y no como (nonatomic, retain)
, como debería haber sido. Esto provocó que se enviara un mensaje de liberación a un objeto que ya contaba con un recuento de 0 (= bloqueo).
Tuve un problema similar; Resulta que no estaba reteniendo un UIButton correctamente. Cómo encontré la causa: - Habilitar zombies - Ejecutar el proyecto con el instrumento ''Asignaciones'' - Usar la aplicación para desencadenar el error - Verificar que los instrumentos muestren el mensaje ''Zombie Messaged'' en la línea de tiempo - Debería haber un enlace que abra los detalles de CALayer: cuando se asignó y se desasignó: está interesado en el lugar donde se asignó, debe ser que ¡aha! colocar en su código
¡Buena suerte!