近期填坑小结
最近工作中碰到了一些问题,翻翻查查的都解决了,也学到了一些东西,记录下来备忘吧。
1、断点调试时变量值都为nil,取不到有效值
问题原因:之前调试一个Release版本崩溃时,将运行模式改为了Release,没有改回来
Debug和Release区别:
- Debug:调试版本,是面向开发者的,只有Debug版本的程序才能使用Trace/Assert等调试输出语句
- Release:发布版本,是面向用户的,Debug和Release调用的是两个不同的底层库,Release版本不包含任何调试信息,所以体积小、运行速度快
Debug和Release在内存分配和释放方式上是不同的,Debug模式下内存会延迟释放,但Release模式下达到释放条件的会立即释放。只要我们在Xcode的Edit Scheme-->Run
中选中了Debug executable
,两种模式运行项目后都是可以打断点的,但是Release模式下,断点处的变量信息在控制台看到的都是nil,打印输出的话会提示variables may not be available
。因此Release版本下的调试操作实际上是没有任何意义的,调试结果也不具有参考价值。
2、UITableView点击Cell,第一次点击没有触发tableView:didSelectRowAtIndexPath:方法,第二次可以触发
问题原因:
UIScrollView子控件为UITableView的问题,在官方文档找到如下解释:
官方文档的这段话意思是说:我们不应该把UIWebView或者UITableView嵌入到UIScrollView中去使用。如果我们这样做了,可能会导致不可预见的行为发生,因为UIWebView或UITableView对象和UIScrollView对象的触摸事件会被混在一块并被错误的处理。
解决方案:
如果是UITableView的话,将scrollEnabled属性设置为YES,这样能够让内部的UITableView对象知道如何去正确处理这个UIScrollView的滚动相关的触摸事件。但既然官方文档不建议这么做,那么还是尽量避免把UIWebView或者UITableView放到UIScrollView中去使用。
3、项目运行后控制台打出很多log:
[framework] CUICatalog: Invalid asset name supplied: '(null)'
问题原因:定位到原因是[UIImage imageNamed:]
传入的参数为nil。但是有一个问题,怎么定位到时哪个文件的哪些[UIImage imageNamed:]
方法传入的参数是nil。有一个Symbolic Breakpoint
断点调试的方法,可以让我们在解决这类问题时事半功倍。
1、点击左下角+
选择Symbolic Breakpoint...
2、右键断点选择Edit Breakpoint...
3、在Symbolic
选项中输入要调试的目标方法,比如[UIImage imageNamed:]
4、在Condition选项输入触发目标方法断点的条件,比如$arg3 == nil
运行程序,如果当前界面有调用目标方法,并且条件满足,就会进入这个方法的断点模式,进入Xcode的Debug Navigator选项,查看调用堆栈,栈顶的方法就是出现问题的代码,直接点击查看即可。
再说一下第4步的$arg3,它代表目标方法的第一个参数变量。比如有一个方法- (void)methodSection1:(id)section1 section2:(id)section2 section3:(id)section3{}
,我要调试这个方法的话,目标方法就是methodSection1:section2:section3:
,$arg
+“数字”代表的含义是:
-
$arg0
代表self -
$arg1
代表方法名,_cmd
-
$arg3
代表参数变量section1 -
$arg4
代表参数变量section2 -
$arg5
代表参数变量section3
解决方案:给出现问题的方法加上逻辑判断,避免传入nil。
4、gerrit用ssh拉取代码报出问题
Unable to negotiate with 10.216.90.129 port 29418: no matching key exchange method found. Their offer: diffie-hellman-group1-sha1
问题原因:并不仅仅出现Mac OS系统,在最新的OpenSSH版本(7.0及更高版本)中,一些老旧的加密算法已经默认不可用了。当客户端使用SSH连接到服务器时,如果老旧算法不可用,客户端和服务器无法就密钥交换算法达成一致而导致连接失败,报出上面的错误提示。目前服务器只提供了一种方法:diffie-hellman-group1-sha1。OpenSSH支持此方法,但是默认没有启用,我们要做的就是去启用它。KexAlgorithms用于生成每个连接密钥的密钥交换方法,host下加入KexAlgorithms=+diffie-hellman-group1-sha1,含义就是使用KexAlgorithms启用diffie-hellman-group1-sha1密钥交换算法。
解决方案:
- 修改ssh config文件
sudo vim /etc/ssh/ssh_config
- 在host下加入
KexAlgorithms=+diffie-hellman-group1-sha1