UITextField委托跳转到100%的CPU使用率和使用键盘快捷键时崩溃
所以,我有一个UITextField
子类,它是它自己的Delegate
,并在使用键盘快捷方式时崩溃。 它最大限度地在CPU
,并没有给出错误。 没有分配它自己的Delegate
,它没有问题。 当它被指定为Delegate
,即使不使用任何(可选)方法,也会崩溃。
自己尝试一下:
子类UITextField
。
- (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { self.delegate = self; } return self; }
它应该会崩溃。
编辑回溯:
* 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 timerFired:] + 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
在使用自我委托UITextField
子类时,我今天遇到了同样的问题。 如果不能将委托更改为自我以外的东西,我会build议覆盖respondsToSelector
而不是实现一个可能返回一个无效对象的customOverlayContainer
方法(你确定它应该是一个UITextField
的实例吗?你怎么知道iOS是不是要求一个UIView
或一个CGLayer
或任何其他types的对象?)
-(BOOL) respondsToSelector:(SEL)aSelector { NSString * selectorName = NSStringFromSelector(aSelector); if ([selectorName isEqualToString:@"customOverlayContainer"]) { NSLog(@"preventing self.delegate == self crash"); return NO; } return [super respondsToSelector:aSelector]; }
通过改变代理到我的文本视图中的对象解决了问题。
我通过自定义customOverlayContainer 解决了这个问题,并返回textFiled。 例如。
@implementation CustomTextField - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { self.delegate = self; } return self; } - (id)customOverlayContainer { return self; } @end
在iOS 7和iOS 6上testing