记一次帮同事排查由命名引发的问题

原创 2016年04月20日 21:20:03

今天同事在群里发了一个问题,问有没有人碰到类似如下的问题:

-[UILabel stringByTrimmingCharactersInSet:]: unrecognized selector sent to instance 0x7ff08c865970

一位同事第一反应是不是对象被释放了,出现了野指针?

然而加上异常断点、开启Zombie诊断后,并没有带来有用的信息。


我转身问是不是必现的?回答是的。

于是我建议直接给UILabel加个stringByTrimmingCharactersInSet:方法,然后打个断点,就可以从调用栈看出是哪里在调用——结果,整个主线程都是系统框架在调用。

但是从主线程调用栈还是可以看到跟UITableView的代理回调方法有关——具体是跟sectionHeader的获取有关。

我们通过直接注释掉相关方法得到了验证:

- (nullable UITableViewHeaderFooterView *)headerViewForSection:(NSInteger)section

的确是跟这里有关,注释掉后问题消失。

那问题基本就落在headerView的布局上了,这是一个继承自UITableViewHeaderFooterView的子类,点击.h头文件一看,我瞄到了有个UILabel *类型变量叫做text。这样的命名会让我心里一纠结,所以很快就感知到了,因为我会命名为textLabel。

于是我说,这样的命名很容易出现问题,容易发生“将这样命名的变量当做NSString *类型进行传递”的现象。

通过修改属性名称,并且在进行一处处替换的过程中我认真地看着有没有将其错误使用,然而并没有——但是问题还是得到解决了。

于是我们推测,在基类中有NSString *类型的变量名为text,但是在子类中重写了它,导致类型变化,进而引发了问题。


这又让我想起:

There are only two hard things in Computer Science: cache invalidation and naming things.

-- Phil Karlton


IOS 字符串中去除特殊符号 stringByTrimmingCharactersInSet 应该用于账号登录等

先上个例子: NSString * str1 =[nameInput.text stringByTrimmingCharactersInSet:[NSCharacterSet whitesp...

__NSCFNumber isEqualToString:的问题.--[__NSCFNumber isEqualToString:]: unrecognized selector sent to in

-[__NSCFNumber isEqualToString:]: unrecognized selector sent to instance 0x7c2680b0 解析服务器返回的状态...

通过stringByTrimmingCharactersInSet去除字符串两端的特殊符号

1、函数简介 苹果的NSString类提供了stringByTrimmingCharactersInSet方法过滤字符串两端的特殊符号,函数声明如下: - (NSString *)...

一次十年后的同事聚会引发的职场感悟

-- 本人2002年上海二流大学毕业,之后两年在国外读了硕士,2004年底回国,加入了当时蓬勃发展的某B4会计师事务所的审计部门,之后辗转多家外企(之后会分享一些跳槽加薪和行业选择的感悟),目前在某...

记同事一次sql 优化(二)

在new_recommend_materials和channel_materials表相同的条件查询,查询时间相差很大,对于你的问题 new_recommend_materials从命名上看是新表,马...
  • fjq5a
  • fjq5a
  • 2017年01月09日 19:33
  • 127

记同事 一次sql优化

最近同事做了一次sql 优化 ,感觉很好,纪录学习下如下所示,该语句查询时间慢,分析过程过下: 1)首先检查实例读写,机器负载均无异常 2)查看channel_materials 表结构...
  • fjq5a
  • fjq5a
  • 2017年01月09日 15:22
  • 90

记一次java程序CPU占用过高问题排查

问题是这样的,将项目部署到服务器上后,发现应用程序的响应速度非常慢,于是开始进行了排查。 TOP 首先查看系统资源占用信息,TOP看一下 发现正在运行的JAVA项目CPU占用率很高,百分...

记一次mysql线上问题排查

背景是这样的,我们有个系统每天都会调起多个定时任务,首先quartz每分钟会调起一次检查时间的任务,如果发现时间到达设定的任务执行时间,java代码会向数据库里写入一条记录,然后有另外一个系统就会根据...
  • xindoo
  • xindoo
  • 2017年06月30日 17:51
  • 291

记一次内存泄漏排查问题

背景     在使用JavaCV做图像处理时,发现程序运行起来之后,处理了百来次的时候,就报了outofmemory的错误。因为javacv底层就是调用opencv的native方法,判断是出现了内存...

记一次磁盘IO高问题排查过程

我们服务器搭建了cacti进行监控,一次通过查看磁盘IO图像的时候,发现每天凌晨3:20-3:35的时候磁盘IO一下飙的很高,然后想知道到底是哪个进程占用那么高的IO,下面是解决方法: 写个检测脚本...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:记一次帮同事排查由命名引发的问题
举报原因:
原因补充:

(最多只允许输入30个字)