壹拾肆

有些安排是多余的 这片空旷对我有益

  上上个礼拜把读了十几年的《骆驼祥子》读完了,说读十几年的原因是因为第一次看《骆驼祥子》大概是我初中,老师让买了一套书,课外看,目的是为了提高阅读理解能力和作文水平。但当时我觉得不喜欢看文学名著,喜欢看小说,觉得文学名著太过严肃,有一张拒人于千里之外的旧学堂老先生凶巴巴的脸,整套书一共十二本,看完的好像只有鲁迅先生的《朝花夕拾》和一两本收录短篇故事的书,而祥子,总是看到祥子朝气逢勃拉着车子在北平窜来窜去的光景,我就抽身走人了,抽身的原因很简单,对于北京的想象和里面人们生活方式,当时我有我一套自己的想象,书里写的和我想象相差很远,所以就走了。
  而重新捡起来看的原因,也很简单,起初是个巧合,因为好久没看书,翻开 kindle 看,前几本分别是《傻瓜式投资》、《软技能》、《退步集》、《骆驼祥子》,里面有故事情节又适合打发时间的好像只有《骆驼祥子》。
  《骆驼祥子》的故事很简单,概述起来大概是讲还是军阀混战年代的北平,一个初入社会,叫祥子的年轻车夫,在攒出属于自己车的过程中,遇到了种种不幸,梦想破灭,人格也随之破产,最后活成浑浑噩噩苟且生活的行尸走肉的故事。
  故事虽然一直都是这个故事,但现在看和以前看的心境完全不一样,在社会上打了几个滚的我,再去看祥子在刚入社会时,给自己打的算盘和不算远大的抱负,对我来说不再有雾里看花的隔阂,更多的是觉得,如果抛开因为时代和环境而产生的,具体到像攒一辆自己的车的这种事,祥子的所思所感,放在所有时代,对比所有时代的年轻人,包括二十一世纪现在的我的所思所想,其实一般无二,初出茅庐不怕虎,被雨打风吹后犹疑怨怼愤懑,最后因为个人际遇不同,有人跳出来后被当做励志的榜样,有人没跳出来被当做“二十岁就死了,但八十岁才被埋葬”,茶余饭后被提起,供人唏嘘的段子。祥子,祥子可能不到八十岁就会被埋葬掉吧。
  和朋友聊天提起看完了这本书,他说了一句人人都是祥子。他大概是想说每个人在经历社会上的摸爬滚打之后,都会变成一种模样,即浑浑噩噩的样子。祥子的结局,有一部分是时代的必然性,所以是普遍如此,还是特定事件,值得商榷。在那之后我们又提到了电影《小丑》。
  《小丑》的剧情就不展开讲了,总之还不错,推荐没看过的朋友可以去看看。
  想想电影里的亚瑟和祥子是否存在一定相似性?祥子心心念念的车,是亚瑟扮成小丑,给人们带来笑声的梦想,亚瑟和祥子都被他们所面临的处境所伤害,受伤之后,亚瑟选择向伤害自己的人开枪,而祥子,因为很难说有某个清晰的、可以用来复仇的目标,最后他只好用钝刀挥向自己内心。
  深究祥子或者亚瑟,何以成为他们本身,我尝试思考了以下两个问题:在同时代的人中,我想拥有他们同样遭遇的人肯定很多,但为什么只要祥子和亚瑟被选中,可以拥有他们的名字?祥子和亚瑟的结局是否拥有某种必然性?
  为什么只有祥子和亚瑟拥有名字,其他遭受不幸的人们都在历史里模糊成某个群体,是祥子或者小丑存在某种值得书写的闪光点吗?关于祥子的答案,我想是否定的,作为《骆驼祥子》这个故事的男主角,他不存在,或者说不可能存在某种特别,相反,正因为他和当时普通的底层劳苦群众一般无二,所以才可以被当做一个例子,与其深究他和劳苦群众有哪里不同,不如直接说他是劳苦群众的一个代表。而亚瑟,亚瑟不是被选中的,他是自己跳出了的,之所以这样说是因为,如果去掉小丑这个辨识度极强的符号,亚瑟可能在每个时代都很多见,受压迫到歇斯底里后陷入疯狂的变态杀人狂,或是因为本身存粹的恶导致的无差别杀人。如果只是因为带着小丑面具杀人而被人记住,这种说法不免有点牵强,而事实上,亚瑟也不仅仅只是因为带着小丑的脸杀人而被人记住,他之所以得以被高举,是因为他杀人在群体围观之下被赋予某种意义,第一次在地铁开枪杀人,对于亚瑟本身来说,是失手和恐惧的混合——事后在厕所的舞蹈虽然可以解释成,他潜意识里本身就想杀人。但无论如何,都和被公众解释成是城市底层边缘人对精英阶层的一次控诉相去甚远,而亚瑟完成自己的蜕变,成为小丑在电视台的演讲,或许有那种意思,但在亚瑟这边,这个演讲,可能是对小丑自我的建立,一段初初登场的自我介绍,是一个开始的标志。而在群众眼里,因为经过舆论酝酿发酵,意义可能远不止于此,在地铁凶案的小丑,在众说纷纭的情况下,登台枪杀了主持人,洋洋洒洒发布了一段正中他们下怀的演讲,这对小丑自发组成的信徒们来说,这是一个集结号,一段对近期发生的所有事的结束陈词,一种思想成熟的标志。
  祥子和亚瑟的结局是否拥有某种必然性?正如前文所述,祥子作为一个代表,他是存在一种必然性的,不在城外被军阀抢走车,也可能因为其他原因失去自己的车,没有被虎妞欺骗被迫结婚,也会因为其他的事情受到类似委屈等等,而亚瑟呢,如果他妈妈小时候没有虐待他导致他得精神病,如果他的同事没有两面三刀,如果那个主持人没有看轻他的梦想,是不是事情就会不一样?但除了他妈虐待他导致他得精神病这点,其他事其实在社会上也都很普遍,而得精神病的妈妈虐待自己孩子导致她孩子也患上精神病的这种事,如果把范围扩大,不止哥谭,我想偶然性也不是很小。那是不是有结论,哪怕没有名叫亚瑟这个小丑出现,也可能会有名叫杰克,或者露西的小丑。不过无论是祥子和亚瑟,预设条件,推导事情结果本身存在一定的不靠谱,所以我们只能通过结果本身去下定义,因为祥子有很多个,而小丑亚瑟只有一个,所以祥子的结局是存在必然性的,而小丑的产生是偶然性更多一点。
  和朋友争论调侃小丑的主持人到底有没有错的时候,因为觉得其实主持人只是把嘲讽当做一个工作,甚至可能不存在任何恶意,虽然嘲笑别人可能不对,但因为嘲笑而收到子弹就太过分了吧。但另一边站在小丑的立场上,遭受如此多的不公平,选择复仇也是一种不得已的理所当然。所以我当时的回答是,只能说大家都运气不好吧。这个回答多少有点含糊其辞的成分,想想最近很多事,因为每次转换立场都觉得可以理解对方,而选择一个模棱两可的态度,这种态度多少有一点犬儒,所以我又深刻的想了想,决定给祥子和亚瑟一个坚定但坚决不是为了表明态度而煲鸡汤的态度:
  祥子和亚瑟不仅是因为不幸,更多的是不公平,因为自己的付出没有得到预期的回报,勤勤恳恳拉车的祥子没有攒到自己梦想的新车,希望带给别人欢乐的亚瑟发现从头到尾自己都没得到过善待。面对不幸,我们仍然可以在种种不幸中保持着早期祥子热忱的心态,和亚瑟在公交车上逗小孩子笑的善良的脸。但面对不公呢,祥子和亚瑟大概是两个错误示范,就此沉沦和过激报复。因为不公的表现有很多,也没有万金油的解决方式,这里只能给一些我的建议,面对小事的不公平,豁达点用“就当是一种修行”的心态一笑了之,不豁达就一句“*他妈”了之,面对大事的不公平,如果不能依靠现有的社会机构解决,也绝不要采取会被现有社会机构解决的方式解决。

  前一阵子公司网站的访问出了一点问题,每次访问的时候都会弹出一个警告页面,类似于这种
  由于之前也没碰过这种问题,只能简单粗暴的归纳出两个方向:
  1.可能是域名原因
  2.可能是服务器原因
  后来问题已经解决的时候看网上分享的资料知道还有一种可能就是,网站本身没问题,之所以出现这个警告页面是因为被运营商 HTTP 或 DNS 劫持了。
  这里刷一条给我们提供域名服务的服务商——时代互联的差评,在解决这个问题的过程中,联系我们账号底下的客服和电话客服,大概联系了不下十次,都没能解决问题,其中有几次,不仅没能帮我解决问题,还用一种推卸责任和不耐烦的态度把我怼的差点憋不住气的跳脚。
  不仅态度有问题,而且他们的工作人员对自己那块的业务好像也不太熟练。因为怀疑网站网站报警告问题,可能和域名服务商的服务可能存在某些问题,所以预期的解决方案中也有一项是迁移域名,迁移域名的话需要通过手机或者邮箱验证,而手机和邮箱这些信息,由于公司人员变动,需要修改。基于这点我问他们工作人员,在修改信息页面中的一个需要勾选的选项,“修改信息之后的 720 天内不能迁移域名”,和接我电话的工作人员再三确认,是不是必须勾选,不勾选会不会有问题,告知我可以不用勾选,并且确认不勾选不会造成什么问题。结果最后我确认修改信息的时候,发现那个选项不勾选竟然不能到下一步。。。
  回归正题,当域名问题不能再域名服务商那边解决时,我开始尝试定位到底是域名还是服务器的问题,具体方式:
  1.把我们的域名指向到另一个服务器,如果仍然报警告,那就是域名问题
  2.用其他的域名指向当前服务器,如果仍然报警告,那就是服务器问题
  测试结果出来后,基本可以定位是域名问题,然后让后台的同事帮了一下忙,安装了一个在腾讯云申请的免费 SSL 证书(这个好像也能解决上述所说的未发现的被劫持问题),但仍然无效,打电话给域名服务商,他说肯定是 SSL 证书不起作用或者是根本就没用,没办法,我只好追着皮球到了腾讯云客服人员那,幸运的是,大厂不愧为大厂,服务完全没有可比性,只是提交了怀疑 SSL 证书可能没生效的工单,对方就帮我检测了我的网站是否有异常,以及用不同浏览器测试,得出 QQ 浏览器访问正常,可能需要向谷歌站长平台提供申述。不过因为在此之前,我就在一个网站申述平台提了一个申述:StopBadware,因为申述通过但网站访问仍然异常。所以带着将信将疑的态度,又重新激活腾讯问题的工单,然后过了一个上午就接到腾讯云平台技术人员的电话,非常耐心的给我解释了他们所做的所有尝试,最后得出结果,只能去谷歌站长平台注册,申述试试看了。
  在谷歌站长平台添加了网站之后,立马有个警告消息提醒我,我们公司的网站存在一些问题,不加思索,我反手就是一个申述,第二天收到邮件,有点出乎意料,竟然没有通过,仔细看邮件描述,推测问题可能出在我们的网站因为提供了很多安卓 apk 的下载,而有一部分 apk 之前在 Google 应用市场因为添加了有风险的广告 SDK 被下架了,然后谷歌站长平台也默认这些 apk 存在一定风险。再次提交申述之前,让安卓的同事提供了去除广告 SDK 的 apk 替换掉服务器里的文件,果然,第二天收到邮件,审核通过了。
  
  这次网站申述的经历给我有两个体会,一个是,只要死磕到底,就一定能让周润发翻译出什么他妈的叫他妈的惊喜。另一个是互联网服务一定要选大厂,盘靓活好态度也呱呱叫。

iOS开发者规范:以苹果开发者中心规范(Coding Guidelines for Cocoa)为标准,添加部分规范。

iOS 命名两大原则是:可读性高和防止命名冲突(通过加前缀来保证). Objective-C 的命名通常都比较长, 名称遵循驼峰式命名法. 一个好的命名标准很简单, 就是做到在开发者一看到名字时, 就能够懂得它的含义和使用方法. 另外, 每个模块都要加上自己的前缀, 前缀在编程接口中非常重要, 可以区分软件的功能范畴并防止不同文件或者类之间命名发生冲突, 比如相册模块(PhotoGallery)的代码都以 PG 作为前缀: PGAlbumViewController, PGDataManager.

阅读全文 »

为了提高编程的效率,有时候也要用上一些捷径。代码片段就是我们可以用上的捷径之一。

一、创建代码片段

阅读全文 »

  上个礼拜又没抽出空写周记,一转眼本周就过去了一半,这篇周记我是星期三开始写的,不知道结束会在星期几,写一篇周记时间周期横跨大半个礼拜,虽然感觉很惫懒,但从时间跨度上看,又是名副其实的“周记”了。
  这个礼拜买了个键盘——罗技 k380,尝试在几个设备之间切换,连接,都很迅速,但按键的手感不是很清脆,有点粘滞, 就像吃东西梗着喉咙的感觉,但离噎着又很远。可能是没习惯吧。不过对于平常在 iPad 上码字勉强够用了。
  新开了两本书《超新星纪元》和《只是为了好玩》,一本科幻小说,一本 Linux 之父的自传。前者主要内容是讲由于行星运动导致地球上的成年人都死亡,只剩下十三岁以下的小孩,而在这群小孩的手上开启了地球上的新纪元。后者只看了个序,不过第一章开头着重讲了他本人的长相,说自己长的如何如何奇怪等等,让我不禁觉得是不是有点刻意,想拐弯抹角的往“奇人必有异相”里靠,不过也可以理解,但凡伟人都多少有些自恋,哪怕平凡如我,早起照镜子也照到出门时手忙脚乱。虽然两本书一个是靠想象力,一个是记叙,但他们里面都有提到一个共通的东西,《超新星纪元》里面说的是孩子社会发展的原动力是玩,《只是为了好玩》里林纳斯解释生活的意思提出了三个层级的诉求,生存,秩序,娱乐。似乎关于这方面的思考,发展进步,生物进化,最后的结果都是为了更好的玩。一边觉得他们的想法有趣,一边有些感概,优秀的人总是能想到一块去。我作为一个后生晚辈,也情不自禁的想举手发言,前辈们,我。。我也觉得玩是人类的最终极的最伟大的诉求。
  工作内容日益增多,有的内容对我有积极影响,有的则不然。周六开会听闻产品助理离职的事,心里没起太多波澜,部门 leader 顺势而为的借这件事敲打包括我在内的几名开发人员,虽然有些话我觉得有失偏颇,但如果不计较这个,对于可以增进改善我的建议,我觉得还是比较客观的。所以心里也没起太多波澜。倒是因为之前和产品助理的针锋相对,让我想到了一些影视小说作品里会出现的桥段,一直针锋相对的两个敌人在最后永别——现实中我们应该也不会再见了的关键时候,忽然相逢一笑泯恩仇,并为之前所有的恩怨争论由其冲突产生的毛刺最终消融为理解,而在关系上以另一种方式达成非常规的相知相识。戏剧化演绎到这,我就打住,没继续在脑子里演绎下去,回过头来又觉得自己颇有些可笑,可笑的原因模糊以蔽之,大概是人间不值得吧。
  每天早上通勤路上背英语单词,虽然现在错误率在下降,但是感觉效果还是不太明显,想下一个阶段配合英文原著阅读学习,但不知道自己能够控制时间,专升本的课进入复习阶段,数据库老师给了一份试卷让周一到周五内完成,结果一直没抽出空。包括这篇博客,写到这里的时候已经星期天晚上了,明天又要开始新的一轮忙碌了。
  刷微博看到一句诗,“人生天地间,忽如远行客。”,有朦胧的孤独感从诗的意境里透出来,百度搜全文看到下一句,“斗酒相娱乐,聊厚不为薄。”好吧,不为薄就不为薄,及时行乐就好。

  最近刷知乎的频率上升,刷的多了之后隐隐感觉到知乎在内容显示上有一些变化,我想可能是它的推荐算法有些不一样了。这种不一样让我想起抖音,我偶尔也会刷一下抖音,频率大概一个月一两次左右,主要目的是看看朋友们的近况,刚下抖音的时候也有过一阵上瘾期,有刷抖音的朋友都很明白他推荐算法的强大,一个视频十几秒,不占用时间,能无限往下翻,虽然一个视频很短,但不知不觉就让人耗费了一两个小时,有隐性的成瘾机制。后来也是因为这个,导致我戒断抖音的,因为太消耗时间了,而且事后心里总有一种不踏实的感觉,就好像放暑假愉快的玩了两个月,一回头发现一无所获,作业一大堆没写的感觉,也可以简单归纳为放纵后的空虚。最近的知乎也给我这种感觉。
  其实除了这些资讯娱乐类的应用,还有很多应用都有这种推荐机制,比如购物应用,淘宝,你在搜索框搜索了某个产品后,接下来几天,他的顶部滚动条,和往下滑的猜你喜欢,一定会存在类似的产品,或者是和产品配套的周边产品,比如你搜 苹果手机,隔天可能就给你推荐苹果手机壳,更过分一点的就是你在某个搜索引擎上搜索,想了解产品相关的信息,然后打开购物应用,就发现里面已经开始推荐你搜索过的产品了。不过这是他们内部的交易,又是另一件事了。
  猜你喜欢这种产品功能,应用极为广泛。包括不止互联网行业,很多传统行业,其实也有做类似的方式,最宽泛的例子,就是当某个行业要出一款新产品的时候,首先会做市场调查,然后确认目标受众,而这个目标受众的反向概念,其实就是为这个群体做一个猜他们喜欢的产品。
  而猜你喜欢的好处也是显而易见的,对于企业来说,可以提升用户粘性,刺激用户消费,有利于开拓新用户等等。对于用户来说,看资讯买东西看到的都是自己感兴趣的东西,可以更好更快地找到自己想要的东西,省时省力。
  但就像前面说的,猜你喜欢也存在着一些缺点。就像你可能在某个投资公司或者投资理财顾问留过号码,之后总有一阵子会频繁的收到好多金融公司的电话,问你杭州地铁口的公寓要不要了解一下。我之前因为学历提升的问题,在某个机构留了一个电话,还是几年前留的,后来每年九月三月学校开学的点,就总有教育机构打电话过来询问我有没有这方面的意向。这种打扰其实是很不好的,而在应用里这种打扰就表现成,很多时候你可能只是想了解一下某方面的信息,但之后就不断收到这类信息。
  我之前因为买了 iPad,想知道有什么应用可以提高 iPad 的生产力,就在知乎上搜索相似问题,搜到了,最后也得到了满意结果。以为事情就此告一段落了。但没想到之后打开他还是给我推送相关内容,而且还是在我没关注这个问题的情况下。而我也因为总有答案是我没看过的,会点开看一遍,正中他们的下怀。但新出现的答案对我有没有帮助呢,答案是否定的。因为 iPad 上有用的应用就那么些,所以很多答案给我推荐的应用重复率很高。我只是看他们在一个结果上的不同解法而已,最终我没有得到新的东西,但时间和精力却被消耗掉了。
  当然你可能会说,是自制力的问题。对于不想再看的东西不看就好喽,但如果真能做到这种地步,抖音这类的应用就不会红红火火的走到现在了,毕竟这个内容也确实是你自己感兴趣的,而且你能克制住自己不看这一类的信息,但还有另一类的信息在等着你,总有一个内容会抓住你的注意力。就像我的知乎上有 iPad 应用的答案推荐,也有“女生什么样的身材算是身材好?”这类的答案推荐,虽然看小姐姐很好,但是在看小姐姐的事上花太多时间就不是很好了。
  当然你还可能会说,那就统统不看喽,把应用卸载掉。这个很好做到,但是结合实际看,其实也有一些问题,我们是社会性的生物,需要和人沟通,和人沟通的核心是信息交换,当我们主动接切断自己的信息来源,我们如何保持和人无代沟的沟通?哪怕你性格孤僻,你也总要生活,总要去了解社会上的各种信息,以掌握如何更好生活的方式,买东西对比不同产品,评测看不看?对比价格优惠,电商网站活动看不看?投资理财更不用说了。
  信息推荐相似度高同质化严重,造成精力耗费是猜你喜欢的一个问题。还有另一个我想说的是,应用的推荐机制虽然给人推荐了很多信息,扩展知识面,但其实因为是按需分配,它在不断推荐的过程中,其实他也在用我们喜欢的信息给我们建造了一个坚硬的认知壁垒。
  为什么这么说呢?我记得我刚开始使用知乎的时候,那时还没有现在的去中心化概念,我看到的内容都是我关注的大 V 们关注、点赞的内容和自己关注的问题内容,当我还在上高中的收,限于见识,我还只是想看看有没有什么好书推荐,有没有什么段子可以解闷,所以关注的都是那类的信息,忽然有一天我看到我关注的一个大 V 点赞了一个修建一个穿透地球的电梯会是怎样,点进去看,里面的答题人真的很认真在用物理知识和地理知识去解释这个问题,列公式上图片做图解,就好像身体力行的告诉我说天马行空的脑洞也可以用一板一眼的数学思维去解答,让我这个知乎萌新好像被反向的按了一下“F5”键,但现在的知乎却很少再给我这种感觉,乏善可称更多了一些。抖音的例子就不举了,情况也大致如此。
  信息时代,我们每天接收的信息看似很多,但其实很多信息是垃圾信息,有些有很强的时效性,有些只是别人输出观点的变体,而更多的是重复信息。我们在享受信息时代的便利,也要警惕信息时代给我们的负面影响,不要让信息主宰我们。
  忽然想起现在在生活里越来越被弱化的存在——电视,他也同样作为信息来源渠道,虽然可能有些东西在电视上是被美化杯筛选后的结果,但是我更喜欢他把各种各样的东西就放在那,放在不同的频道里,等你自己去切台的特点。还记得小学放假在家找电视台动画片看不小心点到 CCTV-10 探索频道,第一次看人文科学的节目被刷新三观的感觉,我觉得一个好的产品应该多给人带来这种感觉。在保留更多的选择权的情况下,加一点点猜你喜欢。

  Yooo~今天终于挤出时间写周记了,上个礼拜落了一篇,就合在这里一块说了。
  上上个礼拜看了徐浩峰的《刀背藏身》短篇集,很有古韵,他在后记里写:

  古人以减省来营造意境,说满、说显了,便无意境。营造意境是为了让人有更多体会,可惜今人拒绝体会,只求告知。

阅读全文 »

一、前言

  在维护一个项目时碰见一个问题,调用了一个方法后不起作用,这种问题一般有两个解决思路,一个是看方法有没有起作用,另一个是看是不是其他的方法打断了这个方法,比如设置 UIButton 的隐藏,但在另一个地方,又把它设置成显示了。这种问题在工程里通过调试代码一般都很好解决。
  但是当它发生在我调用了一个 SDK 方法不起作用时,按照上文的思路,一查看是否是 SDK 方法的问题,这个除了向 SDK 提供人员反应没有其他更好的解决方法了,二是查看是否其他地方也调用了这个方法,使用了不同的参数导致本次的调用失效了。如果这个方法调用的少,可以全局搜索,然后注释掉方法,但是如果之前项目不是你开发的,你只是后期切入进来,同时代码结构一时半会还不能很好把握到,总之想快速利落的排除问题,这时你可以考虑用 Runtime 的特性,把 SDK 里的方法用自己写的替换掉。
  先老调重弹一遍,什么是 Runtime?   

阅读全文 »

  下午在测试一个语音 SDK 的时候,发现打印出来字典里的中文汉字都显示为 UTF-8 的字符,百度了一下解决办法,发现大都是用给 NSArrayNSDictionary 创建分类的方法解决的,但是很多文章可能是写的匆忙,或者是复制粘贴的,不够美观和一目了然。而且创建分类的方式,对比我以前用小码哥的一个类来说,多了一个 .h 文件,不够精简。所以就做个笔记,留作备用。
  首先新建一个 OC 的 .m 文件,不知道怎么新建也可以直接,创建普通的 UIVIew 的类,把 .h 删除,把 .m 所有除注释以外代码删除,修改成如下文所示一致就好。   

Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#import <Foundation/Foundation.h>

@implementation NSDictionary (Log)
- (NSString *)descriptionWithLocale:(id)locale
{
NSMutableString *string = [NSMutableString string];

// 开头有个{
[string appendString:@"{\n"];

// 遍历所有的键值对
[self enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
[string appendFormat:@"\t%@", key];
[string appendString:@" : "];
[string appendFormat:@"%@,\n", obj];
}];

// 结尾有个}
[string appendString:@"}"];

// 查找最后一个逗号
NSRange range = [string rangeOfString:@"," options:NSBackwardsSearch];
if (range.location != NSNotFound)
[string deleteCharactersInRange:range];

return string;
}
@end

@implementation NSArray (Log)

- (NSString *)descriptionWithLocale:(id)locale
{
NSMutableString *string = [NSMutableString string];

// 开头有个[
[string appendString:@"[\n"];

// 遍历所有的元素
[self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
[string appendFormat:@"\t%@,\n", obj];
}];

// 结尾有个]
[string appendString:@"]"];

// 查找最后一个逗号
NSRange range = [string rangeOfString:@"," options:NSBackwardsSearch];
if (range.location != NSNotFound)
[string deleteCharactersInRange:range];

return string;
}

@end
阅读全文 »