Fuck self.delegate = self
来源:互联网 发布:linux apache用户组 编辑:程序博客网 时间:2024/06/10 06:25
故事背景如下,我有一个UITextField的子类MyTextField,创建了MyTextField的实例tf。我希望tf对应的键盘显示done按钮。代码如下:
1 @interface MyTextField : UITextField 2 @end 3 4 MyTextField* tf = [[MyTextField alloc] initWithFrame:someframe]; 5 tf.returnKeyType = UIReturnKeyDone;
然后我希望,当done被按下的时候,键盘关闭,通常的做法是给TextField一个delegate,监听textFieldShouldReturn,当done被按下时,会回调delegate的textFieldShouldReturn方法,代码如下:
8 @interface TextFieldDelegate : NSObject<UITextFieldDelegate> 9 @end10 11 @implementation TextFieldDelegate12 - (BOOL)textFieldShouldReturn:(UITextField *)textField13 {14 [textField resignFirstResponder];15 return YES;16 }17 @end18 19 tf.delegate = [[TextFieldDelegate alloc] init];
这是比较常规的做法,但是要新建一个类,新建一个对象,用完了还要释放这个对象,成本很大。这时我产生了个偷懒的想法,我自己的事情我就自己做吧,我做我自己的代理,self.delegate = self。代码如下,
23 @interface MyTextField : UITextField<UITextFieldDelegate>24 @end25 26 @implementation MyTextField27 - (BOOL)textFieldShouldReturn:(UITextField *)textField28 {29 [textField resignFirstResponder];30 return YES;31 }32 @end33 34 MyTextField* tf = [[MyTextField alloc] initWithFrame:someframe];35 tf.returnKeyType = UIReturnKeyDone;36 tf.delegate = tf;37
干净利落,然后恶梦就开始了。运行这段代码,点击输入框,先是程序就再不响应了,XCode也没什么有用的提示,试一两次,XCode也不再响应了。
这个问题不是我自己解决的,我求助了google。在MyTextField的实现中加入以下函数,
39 - (BOOL)respondsToSelector:(SEL)aSelector40 {41 return [super respondsToSelector:aSelector];42 }
在这个函数中打个断点,再次执行,程序运行到断点后继续执行,会不断的运行到这个断点,然后不断继续,会发现,最终程序在这里无限递归了,参数始终是keyboardInputChangedSelection,直到栈溢出,程序崩溃。
现在我们知道原因了,为什么呢?猜想一下,这个函数的内部大概会是这样实现
45 - (BOOL)respondsToSelector:(SEL)aSelector46 {47 switch(aSelector)48 {49 ...50 case keyboardInputChangedSelection:51 return [self.delegate respondsToSelector:aSelector];52 ...53 }54 }
这个问题已经不在我们能看到的代码层面了,所以即便能解决,也只能非常暴力的重写respondsToSelector,这个和我们要偷懒的初衷不符。
总结一下,self.delegate = self这种写法,在遇到
56 -(void)method57 {58 [self.delegate method];59 }
这种用法的时候,会发生无限递归导致崩溃,一定要避免。
- Fuck self.delegate = self
- Fuck TextField自定义子类(self.delegate = self异常退出)
- self.delegate = self?
- self.delegate = self?
- self
- self
- self
- self
- SELF
- self
- self
- self
- self
- unowned self, 和 weak delegate
- self.modifyContentTextField.delegate = self; 这句话要放在viewdidload 里, 不能放init里。。
- iOS 代理 XX.delegate = self;崩溃问题
- __block typeof(self) bself = self;
- typeof(self) bself = self的作用
- c++学习笔记九
- 浅谈关于nil和 null区别及相关问题(转)
- c/c++经典面试试题及标准答案
- 汇接局与关口局
- Works Applications的笔试题
- Fuck self.delegate = self
- JAVA环境变量设置&&更新adt和sdk的host地址
- silverlight 与IIS宿主的net.tcp WCF通讯实现过程
- C++小Tips--持续update~
- 吐槽CSDN
- c++学习笔记十
- 奋斗黑马程序员----面向对象之多态小结
- c++学习笔记十一
- 创新工场笔试题