本来没有打算针对这个开文的,
昨天工作忙完,闲来无事的时候,逛逛论坛,贴吧啥的,偶然间就发现了有人发bug帖.
http://www.jianshu.com/p/b51ead39c55d
上面说的神乎其神呢…
大家可以去看看.
怀着好奇的态度,下载了源码
干净的很,任何代码都没有
只有sotryboard 拖拽了几个控件, 绑定了present和dismiss的事件而已,除此以外没有任何代码
类似这样
于是编译运行项目
按照他说的,确实出现了这个小而且偏的bug复现
于是想要解决bug
首先不管理内存什么的问题,怀疑是不是vc没有释放?
于是在vc的dealloc中添加打印
-(void)dealloc{
NSLog(@"%s",__FUNCTION__);
}
运行.返现没有任何问题,vc能够正常释放,但是textField确实没有被释放.排除vc引用
编译运行,发现bug已经没有复现了,项目运行正常,vc能够释放,textField也能够释放.所以下定解决,出现bug的原因就是这个属性了.
编译运行,bug复现,说明该属性在iOS11下确实会强引用控件,导致不能释放,
代理完毕之后,找到合适的地方写需要的代码即可
遍历代理方法,发现这三个方法应该都是可以使用的,于是选择第一条,在准备编辑的时候便开始设置相关属性,于一开始就设置应该是一样的效果,完全不影响之前的效果
于是添加代码
-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
if (textField == self.psdTextField) {
textField.secureTextEntry = YES;
} else {
textField.secureTextEntry = NO;
}
return YES;
}
再次编译运行,
bug已经不见了释放问题得到解决.
- (IBAction)back:(id)sender {
[self.view endEditing:YES];
[self dismissViewControllerAnimated:YES completion:nil];
}
所以整个bug修复的过程就是取消storyboard的secureTextEntry属性,改为手动添加,防止强引用,改为到代理里面设置,让系统自动帮我们打破强引用即可.
bug修复demo
https://github.com/spicyShrimp/iOS11_UITextField_Fix
其实这是一个很简单的bug修复问题
所以这个问题其实引出了我们作为iOS开发如何能快速定位bug的问题
在我们开发的时候,我们会经常出现各种莫名的bug,而自己却不能够定位,找不到思路,其实对于bug定位这个是一个技巧和经验的问题
大家都知道的方式有,打断点,逐行判断,打印log,判断是否正确输出…
经验在丰富一点的会使用控制台来po一些属性的值…
这些基本上每一个开发者都天天在用.
但是并不是这些就能完全的解决bug了
解决bug不是一味的出现bug,并且明确了bug发生的地方才能解决,很多bug是系统本事遗留导致
比如,我上篇博文说的文件索引在XCode9中的问题导致的bug就和代码完全无关
比如,上面提到的bug,小而偏,完全无法定位bug出现在哪一行
比如,我昨晚帮网友解决的一个响应链关系的bug,视图层次都是正确的,但是就是没有响应事件,网友却认为是子控件本身的bug导致,却没有换个思路,想到关于图层结构,是否可以响应事件,等基本常见bug,(最终问题也是出在的这里,图层window的问题,这里不赘述了)
所以这里我简单的总结一些解决bug的经验,分享给大家,希望大家都没有bug,
其实,能否对bug的快速定位,也间接反映了你的能力水平
希望大家在开发的时候永远没有bug….
欢迎访问我的系列博客
系列:iOS开发-前言+大纲
http://blog.csdn.net/spicyShrimp/article/details/62218521