经历几次和女友吵架,我得出一个真理,也是她亲口给我说的:XXX你居然蠢到和女生讲道理,小气!
(每次我一脸懵逼)经过我多天的研究和理论分析,默默得出一个结论,女生是感情动物,要是真和你逻辑起来,你可能不是他的对手,并且女生如果把图像思维和逻辑用在编程上,可能都是大佬。下面我来分析我女朋友的编程级别:
MVC 设计模式大佬
日常操作:
女朋友喜欢拍照,并且P图加剪辑小视频,编辑精心策划的文字,发朋友圈让闺蜜好友点赞分享
我来从编程角度分析一下:
如果把今天的穿搭效果作为一个对象,经过多年相处,姿势就大体分为3种,仰视站立叉腰,平面嘟嘴自拍,俯视45度瘦脸自拍,(一下子3个模型声明了,现在差数据了吧)
策划朋友圈的文字她都有一套相应的模版的,还进行了分类(category) 晒美食,晒购物,晒风景,备忘录直接拿出来,再编辑(这里叫浅拷贝,只复制引用用对象指针,不复制对象本身,因为每天的心情都不一样,结尾心得也不一样)
然后再进行P图,选择滤镜,亮晶晶的效果,或者好玩的贴纸,在图片或者视频某个亮点时候出现(UIView控件的点缀玩的炉火纯青)
最后是朋友圈的申明
选择发送的时间,地点也需要考虑一下,(Controller的生命周期玩的6)发送前还得看看有没有撞题材的,撞衫的,(查看私有方法向前引用,如有同名改前缀)如果有,就加以分析,并且提前告知我,“你说我和这女生哪个拍的好看?我这个衣服是不是大了。。。等等”我如果没时间,就给她好闺蜜分析(这个就是发送通知了,由以前对我的代理模式,一对一,转为一对多,问完还不忘加个爱你的语音,来回收内存)朋友圈发送完以后,还会查看自己的好朋友是不是点赞了,哪些玩的好的没点是不是因为什么原因生气
了,我是不是忘记点了她的赞?
(查看点赞对象的引用计数,用完是否回收,排除内存泄漏)
Category的运用
日常操作:
女朋友具有上百种口红色号的记忆,并且分类明确,对于色彩上的对比度精准无比,甚至分一年四季,早中晚对应
我来从编程角度分析一下:
- 她喜欢的口红颜色有相似的吗?这个确实有,但得分先后,贵的能显摆的放在化妆架子上,便宜的就放化妆包日常用,我还特地问了的,为什么颜色那么相近,要买2个,结果被怼了(我们把便宜的口红类当作继承就行了,在她的思维里,不可以有多继承,口红里面都是单继承, 果然是OC大佬)
- 在口红购买上,买新不买旧 (扩展口红类的方法)
- 在口红选择上,几乎用新的,老旧的款式就是看心情和穿搭来用 (重写一个类的方式用继承还是分类.取决于具体情况.假如目标类有许多的子类.我们需要拓展这个类又不希望影响到原有的代码.继承后比较好.
如果仅仅是拓展方法.分类更好.(用新款式,不需要涉及到原先旧的口红颜色))
分类中方法的优先级比原来类中的方法高,也就是说,在分类中重写了原来类中的方法,那么分类中的方法会覆盖原来类中的方法(同样色号,贵的分类能覆盖掉便宜的分类使用率)
内存管理的运用以及KVC KVO
日常操作:
桌子地上的垃圾袋,卫生纸,哪怕前1分钟制造的,都必须及时清理,垃圾袋每天都得倒干净,不然回家必吵架,一个星期2-3次卫生扫除 洁癖狂
我来从编程角度分析一下:
- 她心情好,看见我在制造垃圾的同时会手动丢掉回收,并且提醒(自动内存计数ARC)
- 她心情不好,看见我在制造垃圾的同时会命令我立刻丢掉,并且眼神一直盯着我的下一步行动,如果我不行动,属性还是坐等,她就会发火,拿枕头打我(手动内存计数MRC:遵循内存谁持有并申请、谁释放;谁添加,谁释放的原则。KVO是一种基于KVC实现的观察者模式。当指定的被观察的对象的属性更改了,KVO会以自动或手动方式通知观察者。2者相结合,实属大佬)
- 我个人是喜欢吃完再收拾的那种,或者一个星期清理一次(我这种模式在她眼里就是 :内存释放池Release Pool把需要释放的内存统一放在一个池子中,当池子被抽干后(drain),池子中所有的内存空间也被自动释放掉。内存池的释放操作分为自动和手动。自动释放受runloop机制影响。
) - 当她有时候很忙,没时间打扫卫生时候,看着我堆积一袋子垃圾,地上也有灰的时候,这时候她会扣我的零花钱来惩罚我,我因为害怕,属性由坐等强制变成勤劳(KVC(key-value-coding)键值编码,是一种间接访问实例变量的方法。提供一种机制来间接访问对象的属性。
1、给私有变量赋值。把我零花钱变量改变
2、给控件的内部属性赋值(如自定义UITextFiled的clearButton,或placeholder的颜色,一般可利用runtime获取控件的内部属性名,Ivar *ivar = class_getInstanceVariable获取实例成员变量)。我属性变成勤劳了!
[textField setValue:[UIColor redColor] forKeyPath:@”placeholderLabel.textColor”];
3、结合Runtime,model和字典的转换(setValuesForKeysWithDictionary,class_copyIvarList获取指定类的Ivar成员列表))给我时间打扫的Runtime卡的非常准
GCD的运用
日常操作:买奶茶或者超市结账,她总是眼睛很神,总能找到最新开的队伍,然后快速排队出去
我来从编程角度分析一下:
- 如果队伍不长,她就安心排队(让任务一个接着一个地执行(一个任务执行完毕后,再执行下一个任务),按照FIFO顺序执行.)
- 如果队伍很长,她就叫我和她分开排队。分头寻找最短的队伍,如果一方进行的快,最后再汇总(并发队列(Concurrent Dispatch Queue)
可以让多个任务并发(同时)执行(自动开启多个线程同时执行任务)
并发功能只有在异步(dispatch_async)函数下才有效) - 如果队伍很长,并且分开排队,但网络不好,手机支付有问题时候,她会优先让后面人结账,并命令我到网好的地方支付,她在原地等待接应,支付成功
就可离开,不成功继续让下一位顾客支付,不影响他人排队 (栅栏函数 一个dispatch barrier 允许在一个并发队列中创建一个同步点。当在并发队列中遇到一个barrier, 他会延迟执行barrier的block,等待所有在barrier之前提交的blocks执行结束。 这时,barrier block自己开始执行。 之后, 队列继续正常的执行操作。)