记一次Debug过程

前言

  • 在写实现等高自定义Cell自测项目时,自己导致的数个Bug。
    • 因为项目较为简单,所以在实现时特意使用了一些之前学过的知识(例如懒加载、AutoLayout布局等知识)
    • 简单说下之前实现的思路
      • 模型部分
        • 最先写的模型,这个很简单。直接将plist文件中的数据抽象成模型的属性即可。
        • 创建一个类方法用于传入数据返回模型对象。
        • 需要注意的是,模型属性和数据源的键值一致的话,可调用模型对象setValueForKeyWithDict(记忆是这样的,实际为setValuesForKeysWithDictionary)方法简化对为模型属性赋值的代码。
          • 此方法为KVC(Keys Values Codeing)技术,用于简化键值对编码代码。
      • Cell部分
        • 该自测项目的重点在于这个部分,这部分也不难。先给每个数据展示需要的控件添加到属性中,再添加一个Model属性。
        • 我先重写Model属性的set方法,用于控制器一旦设置属性,其Cell内部各子控件状态即发生改变。
        • 然后是各控件的布局了,本来这个可以用Frame定位技术重写layoutSubViews方法就行的,但是觉得计算各种坐标太麻烦,所以就使用了AutoLayout技术。这也是后面Bug产生的主要前提。
      • 控制器部分
        • 这个没什么好说的,本来想删掉自带的ViewController新建TableViewController的,但是想到删掉ViewController就要动Storyboard,动了Storyboard就不叫纯代码了。索性就在自带的ViewController中增加了一个TableView属性。
        • 遵守UITableViewDataSource、UITableViewDelegate协议并实现相关方法。
  • 排除Bug记录(按时间顺序)
    • 第一次运行,正常进App,界面正常显示TableView但无数据。
      • 第一时间检查模型与数据、控件赋值处是否有误,经检查无误。
      • 然后想测试TableView是否能正常获取数据,于是就在numberOfRowsInSection方法中输出一段文字,经测试程序无法进入该方法输出文字。此时考虑无法加载的话应该是控制器与TableView中间关联出现问题,检查创建TableView对象处代码,经检查无误。然后点进Storyboard是想起拖线(控件相关属性与控制器关联)操作,检查控制器处代码,无控制器成为控件代理、数据源代码实现。代码予以补齐后运行,程序成功打印之前测试输出文字。
      • [x]此处Bug解决。
    • Bug No.2
      • 此时程序虽然成功打印文字,但是打印之后程序直接cash,报错如下图。

        记一次Debug过程_第1张图片
        14738751365250.jpg

        • 看到constraint字样第一时间想起约束冲突,检查Cell控件添加约束处。发现忘写禁用AutoresizingMask自动转约束了,给各控件都补上。
        • 再次运行,程序还是秒cash,错误依旧。此时仔细看了下报错信息,大概意思是添加约束的代码中multiplier参数不能为0或nil。
          • 先检查各控件添加约束代码multiplier参数是否有置零,经检查无。
          • 将错误放在bing上搜索,得到的内容大约都是解释该错误是multiplier参数为空或置零导致,检查这项相关的参数值即可。结果无帮助(我的multiplier参数是用绝对值写死的)。
          • 继续查看搜索结果,某个blog中提到可能是某个view为nil。回头看代码发现我的控件添加代码放在约束添加代码后,因为约束添加代码中有需要当前控件父控件的属性,获取当前控件父控件时,控件父子关系尚未形成导致获取到的值为nil从而导致上图乘数为零错误。
          • 调整代码顺序后,本BUG解决。
          • [x]
      • Bug No.3

        • 当程序不在报乘零错误后,程序运行依然cash。报错信息如下


          记一次Debug过程_第2张图片
          14738768017436.jpg
          • 第一时间吧这个错误信息放bing中搜索,得到的结果基本不能解决我的问题。
          • 只有放大招跟着程序流程在关键地方打调试信息(Xcode无单步调试,不怎么喜欢打断点)。随着慢慢的推进发现TableView在获取Cell控件时,Cell还未被创建完毕程序即cash。这时猜测可能是Cell在创建时的代码有问题导致程序cash。
          • 检查Cell代码,跟着流程使用二分法排查,最终发现.................................................在模型属性set方法里,我把Cell中ImageView控件属性的值赋值成了ImageView,猛地看上去代码并无问题,左边是模型的ImageView属性,右边是被赋了值的ImageView。
            记一次Debug过程_第3张图片
            14738777534766.jpg
      • 问题就出在这里,我的属性初始化方法都是在get方法中加载的,而在初始化代码中我已经创建过ImageView了,所以此处只需要给Icon.Image即可,而不是给一个ImageView实例对象属性强行赋值另一个ImageView。

      • 修改之后,代码终于顺利的Work了。

      • [x] Bug解决!

    • 后记
      • 代码成功Work之后,Cell样式高度太低,实现了一个设置Cell高度的TableView代理方法解决。
      • 其他边边角角修整。
  • 总结:
    • 自己学艺不精,好些知识点记忆已经模糊。

      粗心大意害死人呀呀呀呀哎呀呀呀!!!


                    记于 2016年9月15日凌晨02:42分

你可能感兴趣的:(记一次Debug过程)