一些常见的小问题列表,持续积累,不能两次都被同一个问题搞死!
1. UIButton 使用xib 创建,频繁改变tittle 时候闪烁。将Button的type改为 custom。看这里
2. 有些下载过来的demo,方法使用事例在单元测试中,记得为单元测试添加Cocoa Touch Testing Bundle。看这里
3. 使用MathQuill渲染数学公式的问题。因为需要用到jquery,于是在html的头部使用了 Google的jquery cdn,然后在模拟器上运行没有问题,因为模拟器用了iMac的穿墙网络。放到真机上不行,因为真机没有用穿墙网络!所以换个cdn。问题是通过启用Safari 的web检查发现 jquery资源没有加载成功。
4.cocoapod 不更新本地的库,只更新新添加的库命令:
pod update --verbose --no-repo-update
5. 使用AFNetworking 在做网络提交的时候,默认使用 form 方式提交,这样在请求体中,如果有数组会变成类似于这样的格式
book_name[]=一年级&book_name[]=上册
如果数组中还包含有对象 例如 data =[{questionId: 1467709995fckkjd, questionTypeId:1, subject:2}]
将转换成 data[][questionId]=1467709995fckkjd&data[][questionTypeId]=1&data[][subject]=2
而后台期望的方式却是json提交,所以这个问题解决方案就是改为json提交,上边转换后的格式就变成了类似的 "coursewares": [{ "id": "1471939616ytscrb", "product_id": "1471940034afigyt" }]
6.使用zsh作为shell终端时候,环境变量 .bash_profile 不会加载,而是会加载 .zshrc 这个配置文件,所以我们依然可以在 .bash_profile 配置环境变量,只是在 .zshrc 配置文件中使用 source命令,主动调用 . bash_profile ,使其设置的环境变量生效即可。
7.使用Jenkins做自动集成,需要去掉“自动创建scheme”选项,因为Jenkins的Xcode插件并不会自动帮你创建,所以在构建过程中,出现scheme为空的情况
8. 设置父视图透明而子视图不透明的处理
self.view.backgroundColor = [[UIColor whiteColor]colorWithAlphaComponent:0.7f];
这句代码只是针对了view 的颜色给出了透明度,而不是针对view这个整体
9.storyboard 自定义cell问题。
在storyboard 中对collectioncell做自定义,在cell中设置 Identifier 后不需要在对cell注册,以下代码不再需要 self.collectionView!.registerClass(StudentShowcaseCell.self, forCellWithReuseIdentifier: reuseIdentifier)
,否则将无法按照storyboard中设计的样式来初始化,因为你用的是 Class 注册啊
10.关于线程取消的问题
调用NSOperation 或者thread的 cancel方法, 并不是严格意义上的线程的取消,只是把该线程的cannelled属性标记为YES状态来表示该线程即将要退出。要实现取消功能,我们需要在线程的main函数中定期检查isCancelled状态来判断是否需要退出,当isCancelled为YES的时候,我们手动退出,如果我们没有在main中检查isCancelled状态,那么调用-(void)cancel;方法将毫无意义。NSOperation 是抽象类!!!
11. 使用storyboard 搭建UI连接 action的时候,出现 “Could not insert new outlet connection: Could not find any information for the class named”问题
可以clear 一下工程,然后去删掉Derived Data,或者删除对应类在项目中的引用,然后重新添加类文件。不知道为什么,反正这样我解决了问题,坑爹的Xcode!
12.即使使用atomic 也是不安全的
在属性中使用atomic 进行修饰,启示只是修饰了 对应的get 和 set方法。而在多线程中,但线程的执行并不一定会按照代码的书写逻辑,比如有连着的两个for 循环,其中一个写,另一个读,就完成可能造成数据不一致。如果要保证一致,应该对执行代码做锁操作保证执行顺序。
13、弱引用实现原理
弱引用的实现原理是这样,系统对于每一个有弱引用的对象,都维护一个表来记录它所有的弱引用的指针地址。这样,当一个对象的引用计数为 0 时,系统就通过这张表,找到所有的弱引用指针,继而把它们都置成 nil。这意味着有系统的开销,不可盲目使用,不然对象对象创建后就销毁了,不利于重用。
14、pod私有库制作问题
1、所有spec 文件应该在一个公有仓库,需要同步到 repo 中去,这样在执行 pod install & update 时候才能拉到最新tag 的源码。
2、开发状态可以通过主项目的podfile 配置不同的分支,或者指定本地环境,等稳定之后同步源码到私有仓库,并修改和同步对应的 spec到 公共仓库
3、使用subspec 指定私有库等文件组织结构,可以参考AFNetworking
15、NSUserDefaults的 synchronize 方法调用问题
简单说了就是如果考虑到一些特殊情况下的app退出,这个时候本来还在进行plist文件的写入,那么如果不调用s ynchronize() 方法,可能出现的问题就是这部分写入的数据丢失。如果调用了,那么就可以保证写入的成功。所以大多数情况下,即使没有调用synchronize 方法,也没问题。BTW,NSUserDefaults本身是提供了锁处理,排除上面因素,我们可以直接调用读写操作并保证线程安全。
16、通过DNS映射优化网络请求
请求的域名不通过dns服务器做映射,而采用本地的方式,自己设置dns映射机制,直接使用IP地址来进行访问。(感觉这个应该是复杂的大app才用得上,小规模app 基本没想过这事)本地的映射文件,也需要从服务器定期同步。
17、关于属性重写要知道的
如果只是重写getter 或者setter,可以直接写对应的方法,如果要同时重写getter和setter,那么我们需要对该属性使用 @synthesize name = _name
这样的方式来处理属性,不然编译报错,提示找不到_name 对象的声明,因为如果读写方法都重写,编译器不会自动为你生成 _name 方法,所以才会报“未声明对象”
18、关于 __weak 和 __unsafe_unretained
使用 __weak 修饰对象是有性能开销的,需要去遍历weak 表,并且将表里边的所有指针置空。__unsafe_unretained 不会将指针指置空,所有有也指针问题,但它的存在是为了配合C 语言。
19、读大文件用内存映射文件的方法来处理,避免将文件全读进内存中。
如果是iOS,可以直接用NSData的 + (id)dataWithContentsOfFile:(NSString *)path options:(NSDataReadingOptions)readOptionsMask error:(NSError **)errorPtr;
其中NSDataReadingOptions可以附加一个参数NSDataReadingMappedIfSafe参数,这样其实内部就是用了内存映射文件大方法。
20、实现一个文件一行一行读的思路
读一行的思路是:每次向前读10个长度的数据,如果这10 长度的数据中,没有换行符,那就将句柄向前移动10 位置,如果有换行符,那就移动到换行符前面,这一段数据,就是需要的那一行数据了。
网友评论