El delegado de UITextField saltó al 100% de uso de la CPU y se bloqueó al usar el método abreviado de keyboard

Entonces, tengo una subclass UITextField que es su propio Delegate y se bloquea cuando se usan atajos de keyboard. Se maximiza en la CPU y no da un error. Sin asignarse como Delegate , funciona sin problema. Cuando se le asigna como Delegate , se bloquea incluso cuando no utiliza ninguno de los methods (opcionales).

Inténtalo tú mismo:

Subclass UITextField .

 - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { self.delegate = self; } return self; } 

Debería fallar

EDIT Backtrace:

 * thread #1: tid = 0x3bb8d, 0x39f14726 libobjc.A.dylib`lookUpImpOrNil + 18, queue = 'com.apple.main-thread, stop reason = signal SIGSTOP frame #0: 0x39f14726 libobjc.A.dylib`lookUpImpOrNil + 18 frame #1: 0x39f0dcb6 libobjc.A.dylib`class_respondsToSelector + 34 frame #2: 0x39f1d05c libobjc.A.dylib`-[NSObject respondsToSelector:] + 32 frame #3: 0x323b9242 UIKit`-[UITextField respondsToSelector:] + 46 frame #4: 0x325c88a2 UIKit`-[UITextField customOverlayContainer] + 50 frame #5: 0x325c8730 UIKit`-[UITextField automaticallySelectedOverlay] + 28 frame #6: 0x32554208 UIKit`-[UIKeyboardImpl inputOverlayContainer] + 424 frame #7: 0x32553942 UIKit`-[UIKeyboardImpl _autocorrectPromptRects] + 454 frame #8: 0x323c7530 UIKit`-[UIKeyboardImpl updateAutocorrectPrompt:] + 368 frame #9: 0x323e63e0 UIKit`-[UIDelayedAction timerFinetworking:] + 80 frame #10: 0x305fbe6c Foundation`__NSFireTimer + 64 frame #11: 0x2fbe1e86 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 14 frame #12: 0x2fbe1aa2 CoreFoundation`__CFRunLoopDoTimer + 794 frame #13: 0x2fbdfe2a CoreFoundation`__CFRunLoopRun + 1218 frame #14: 0x2fb4a540 CoreFoundation`CFRunLoopRunSpecific + 524 frame #15: 0x2fb4a322 CoreFoundation`CFRunLoopRunInMode + 106 frame #16: 0x348812ea GraphicsServices`GSEventRunModal + 138 frame #17: 0x324011e4 UIKit`UIApplicationMain + 1136 frame #18: 0x0009929c Today`main(argc=1, argv=0x27d79c80) + 164 at main.m:29 

Hoy me encontré con el mismo problema al trabajar con una subclass UITextField . Si no es posible cambiar el delegado a algo que no sea uno mismo, recomiendo replace el customOverlayContainer lugar de implementar un método customOverlayContainer que puede devolver un object no válido (¿estás seguro de que se supone que es una instancia de UITextField ? ¿Cómo sabes iOS ¿No está pidiendo una UIView o una CGLayer o cualquier otro tipo de object?)

 -(BOOL) respondsToSelector:(SEL)aSelector { NSString * selectorName = NSStringFromSelector(aSelector); if ([selectorName isEqualToString:@"customOverlayContainer"]) { NSLog(@"preventing self.delegate == self crash"); return NO; } return [super respondsToSelector:aSelector]; } 

Problema resuelto cambiando el delegado al object que entra en mi vista de text.

Resolví esto con customOverlayContainer personalizado y devuelvo el text Fijo. p.ej.

 @implementation CustomTextField - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { self.delegate = self; } return self; } - (id)customOverlayContainer { return self; } @end 

Probado en iOS 7 y iOS 6.