技巧:
1.方法调用优先级: 本类别-> 本类->父类别->父类
2.以类族模式,隐藏实现细节
3.将类的实现代码,分散到便于管理的几个分类当中去
4.把属性定义到"主接口"中要比定义在分类里清晰得多,类所封装的全部数据都应该定义到主接口;分类机制应将其理解为一种手段,目标在扩展类的功能,而非封装数据;
5.属性所要表达的意思是:类中有数据支持着它,属性是用来封装数据的;
6.若对象所遵从的协议不为人所知,则可于匿名分类中声明; 协议也像类一样支持前置声明;
7.如果具体类型不重要,重要的是对象能够响应协议中的方法,那么可以使用匿名对象来表示;
8.用自动释放池降低装有多个对象数组遍历时产生的内存峰值;
9.用"僵尸对象"调试内存管理问题;系统会修改对象的isa指针,令其指向特殊的僵尸类;向僵尸对象发消息后,会打印一条包含消息内容及其接收者的消息,然后中止应用;
10.定义block的范围内,全部的变量都可以为其所捕获,如果捕获的变量是对象类型,就自自动保留,系统在释放block的时侯,也会将其一并释放;
11.Clang是开发Mac OS X 及iOS程序所用的编译器;
12.定义block的时侯,其所占的内存区域是分配到栈中的,block只在定义它的范围内有效;
13.给block对象发送copy消息,就可以把block复制到堆上;这样就可以在定义它的范围之外使用,而且,一量复制到堆上,block就成了带引用计数的对象了,后续的复制操作都不会真的执行复制,只是增加block对象的引用计数;
14.给block起别名的好处:看起来更舒服,也方便统一修改block的参数,返回值;但也要注意不要有别名冲突;
15.使用handler块降低代码的分散程度,理解block为单个对象服务,而代理为多个对象共同服务,在代理方法中,可能要对对象进行判断;
15.处理成功Handler块与处理失败的handler块分开写优缺点:代码易懂,有需要还可以其中一个handler省略,但不太灵活
17.处理成功,失败合并一个handler优缺点:逻辑都写在一起,代码块变长,但比较灵活;比如:下载数据时一半时,突然网络故障,这种情况,可以把数据及相关错误都回调给块, handler就能据此判断问题并适应处理,还可以利用已下载的部分数据做些事情;另外,调用api的代码可能会在处理成功响应的过程中发现错误,比如,返回的数据可能太短了,这种情况需要和失败一同处理;要是把成功handler与失败handler分开写,就没办法共享同一份错误处理代码;
18.如果知道block创建一次,只执行一次,且知道一定会执行情况,最好在其执行后,就置空;则可完全避免外面使用block时会造成循环引用;
19.使用NSStrikethroughStyleAttributeName : @(NSUnderlineStyleSingle)给UILabel划删除线,自由颜色,自由范围
20.添加对象至可变数组或可变字典时,需要添加判空保护
21.viewController与Model对象的消息传值可使用KVO,Delegate,Block,Notification
22.MJExtension使用KVC给对象赋值,即使私有属性也不受影响
23. self.KVOControllerNonRetaining self.KVOController 发起的观察方法的回调block中都需要弱化self,否则会造成内存泄露
24. self.KVOControllerNonRetaining 弱引用被观察者 self.KVOController 强引用被观察者
25.self.KVOController引用图
26. a.只有copy不可变字符串是浅拷贝, 其他copy,mutableCopy都是深拷贝;
b.copy不管是可变字符串还是不可变字符串,拷贝出来的都是不可变字符串;
c.mutableCopy不管是可变字符串还是不可变字符串,拷贝出来的都是可变字符串;
27. 在使用NSMutableArray,NSMutableString属性时,使用strong修饰,需要浅拷贝时self.a=a; 需要深拷贝时 self.a = [a mutableCopy];
28.不要重写cell的-setFrame:方法,此方法会导致,清除数据源再刷新时,屏幕刷新慢,短暂白屏;
29.强制将开发分支内容覆盖主分支(主分支开发,分支保留线上发布版本)
切换到旧的分支-->git checkout master,将本地的旧分支master重置成develop-->git reset –hard develop 再推送到远程仓库-->git push origin master –force
30.使用自定义View封装collectionView制作自增高不滚动标签组:设置固定宽度--reloadData--从flowlayout对象获取contentSize--collectionView的Size设为contentSize--自定义view的Size设置为contentSize--更新自定义View的约束
31.全局文件中,不要放经常改动代码,全局文件改动,XCode全量编译
32.BaseVC类中不要实现-loadView:否则,带xib的子类无法加载xib
33.侧滑返回手势最好设置为边缘生效,否则有可能与tableViewCell的侧滑手势冲突
34.ScrollView做为clildVC.view的容器控制右左展示时,要注意contentOffset自动重置
35.UIPickerViewController可以获取本地视频
36.iOS的GridView: 使用UIView做容器,观察collectionView的contentSize的变化,修改UIView的frame
37.xib中转站:利用自定义view类,做为xib的owner,在-initWithFrame:用UINib加载xib,再从nib中获取xib上的视图实例,然后添加到自定义view上,同时在自定义view类实现-initWithCoder:这样自定义view又可以在另外大容器xib上启动
38.自增高容器:动态添加图片的情况,除了添加视图时设置好约束,也要考虑到后台没有给图片url时,也要使用代码补全上,下间约束
39.并列数据结构->树型数据结构 a.使用递归遍历
40.树型数据结构->并列数据结构 a.遍历生成字典@{idPath : itemObj,...} b.遍历出obj,通过obj.idPath找到parentObj, 用parentObj持有的容器添加obj
41.使用AVPlayerItemVideoOutput对m3u8格式视频截屏, 需要注意m3u8格式的视频流在截取时需要传入一个AVPlayerItemVideoOutput对象,这个对象一定要在AVPlayerItem初始化的时候设置好,如果以临时变量的形式传入或导致截取失败。
42.直接添加Xib视图为tableFooterView,会导致footer高度变大,解决:在xib视图上套一个容器
43.Deployment PostProcessing Debug--NO(防断点失效) Release--YES(减少生产环境日志)
44.使用UIView做CollectionView的容器来封装一个SegmentBar,可以充分利用collectionView滚动,复用,单双选等方法属性
45.使用自定义GridView(collectionView容器)来实现添加图片的9宫格,逻辑比for循环生成布局视图要简单得多,另外,GridView持有图片数组images,当添加(或替换)图片点击,内部记录操作index,便于在外部获取图片后处理图片,即gridView调用-handleImage:(id)image即可,方法内部根据index,images.count,maxCount等来判断是添加还是替换操作
46.微信朋友圈Cell,初始化固定视图与动态加载视图容器,容器不约束高度,待动态加载时添加约束将容器撑开,在容器内部设置间距,无数据时则不显示间距,Cell内部约束好,使用第三方库自动计算Cell高度,评论部分采用内嵌TableView,赋值时计算好高度并缓存,刷新时从缓存取高度;
47.UIView自增高建立在内部,外部共同约束的基础之上,即:外部约束位置,宽度,不约束或放宽约束高度,内部子控件约束要能够对UIView形成撑开之势
网友评论