注意:由于idfa会出现取不到的情况,故绝不可以作为业务分析的主id,来识别用户。
因此,IDFA就是用来跟踪广告推广的,而UUID虽然每次不同,但是可以自己手动存入Keychain来进行唯一性的确保,这么说来IDFA就是如果广告商投放的时候使用,而UUID就是自己后台来判断用户是否换了设备,或者信息不一致需要重新登录的业务。
uuid+KeyChain: 手机重置,钥匙串证书过期,更新系统(某些情况下)不是还是会变么
手机重置刷机肯定会变,就好比我们坐牢了,出狱之后不要之前的身份,直接废弃,换个新的身份证,这无法避免的,你把它理解为两个不同的用户,重新绑定就好了。
双击home:applicationWillResignActive
单击home:applicationWillResignActive --> applicationDidEnterBackground
下拉通知栏:applicationWillResignActive
上拉工具栏:applicationWillResignActive
kill App:applicationWillResignActive --> applicationDidEnterBackground --> applicationWillTerminate
- 你实现过一个框架或者库以供别人使用么?如果有,请谈一谈构建框架或者库时候的经验;如果没有,请设想和设计框架的public的API,并指出大概需要如何做、需要注意一些什么方面,来使别人容易地使用你的框架你实现过一个框架或者库以供别人使用么?
一般公司都会有核心开发团队和普通开发团队,然后公司的核心业务由核心开发团队写成静态库然后让普通开发团队调用,这样就算普通开发团队离职也带不走公司的核心业务代码。一般核心开发团队是不会离职的。
有静态库自然就有动态库了。这里所谓的静态和动态是相对编译期和运行期的。静态库在程序编译时会被链接到代码中,程序运行时将不再需要改静态库,而动态库在编译时不会被链接到代码中,只有程序运行时才会被载入,所以 hook 别人程序或者说做插件都是运用了 runtime 机制,然后动态库注入修改的
http://blog.51cto.com/13594541/2084331
a.二维码扫描
b.actionSheet AlertView
- runtime
a. 获取相关的私有属性 .UITextField占位文字颜色(工具类)
b. 替换方法, 比如按钮点击延迟
c. 字典转模型
d. 给分类动态添加属性
- runloop
runloop: 从字面意思看:运行循环、跑圈,其实它内部就是do-while循环,在这个循环内部不断地处理各种任务(比如Source、Timer、Observer)事件。runloop和线程的关系:一个线程对应一个RunLoop,主线程的RunLoop默认创建并启动,子线程的RunLoop需手动创建且手动启动(调用run方法)。RunLoop只能选择一个Mode启动,如果当前Mode中没有任何Source(Sources0、Sources1)、Timer,那么就直接退出RunLoop。
- 为什么把NSTimer对象以NSDefaultRunLoopMode(kCFRunLoopDefaultMode)添加到主运行循环以后,滑动scrollview的时候NSTimer却不动了?
nstime对象是在 NSDefaultRunLoopMode下面调用消息的,但是当我们滑动scrollview的时候,NSDefaultRunLoopMode模式就自动切换到UITrackingRunLoopMode模式下面,却不可以继续响应nstime发送的消息。所以如果想在滑动scrollview的情况下面还调用nstime的消息,我们可以把nsrunloop的模式更改为NSRunLoopCommonModes.
- git的使用
check out
commit
push
pull
discard all changes
git clone + 远程仓库地址:克隆远程仓库至本地,全部都克隆下来了。
我参与开发的项目的分支一直都是按照这样的规则进行创建的:
master 分支(主分支,无论什么情况下,都要保证主分支的正常运行)
developer 分支(处于开发阶段的分支,正常来说,此分支的的功能要多于 master 分支)
开发人员姓名分支比如我的分支就是 sunxu ,每次在本地进行开发的时候,切换到我自己的分支上进行开发,开发完成、测试完成之后,提交分支到远程仓库,直接进行与 developer 分支的合并,其他人同样如此,都是提交分支到 developer 分支,合并到 developer 分支,最后与 master 分支进行合并
后端技术掌握情况
SSH,JFinal内存警告
在收到内存didReceiveMemoryWarning的警告时,释放掉一些不再需要的资源,注意编码规范,如一些变量不使用需要及时的释放。避免是占用太多的内存空间,有时需要用空间去换取时间,尽量使用一些高效的算法和数据结构节约内存空间。最后使用一些内存检测工具和代码的静态分析查找内存泄漏和分配(instrument,leaks,allocations)。
//清除SDImageCache内存消耗大户
[[SDImageCache sharedImageCache] clearMemory];
int cacheSizeMemory = 4*1024*1024; // 4MB int cacheSizeDisk = 32*1024*1024; // 32MB NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:cacheSizeMemory diskCapacity:cacheSizeDisk diskPath:@"nsurlcache"]; [NSURLCache setSharedURLCache:sharedCache];
之前图片较多 微博:图片model 大中小
NSTimer 一定要在恰当的地方执行 invalidate,否则会造成内存泄漏,但是用 GCD Timer 就可以绕过这个问题
- 自定义collectionView
线性布局, 瀑布流布局, 圆形布局
cell:
每一个cell都对应的有一个UICollectionViewLayoutAttributes来设置他的一些属性, 当我们在修改他对应的UICollectionViewLayoutAttributes的相关的属性的时候, 就间接的实现了对响应的cell的相关属性的修改。
所以我们对collectionViewCell的很多自定义就落在了对相应的UICollectionViewLayoutAttributes上面
UICollectionViewLayout:
要完成collectionView的布局是需要设置他的属性 collectionViewLayout, 当使用storyboard的时候是默认为UICollectionViewFlowLayout, 实际上UICollectionViewFlowLayout是继承自UICollectionViewLayout, 由系统实现的一种collectionView的布局。
所以我们可以继承UICollectionViewLayout来自定义我们想要的布局。
继承自UICollectionViewLayout, 重写prepareLayout(),在这里面我们计算好所有的cell布局
- 二分查找
二分查找优点:
1.速度快 2.比较次数少 3.性能好
缺点也很明显:
1.必须是一个有序的数组(升序或者降序)
2.适用范围:适用不经常变动的数组
https://www.jianshu.com/p/fa44869316f9
12.冒泡排序
每一轮让第一个数与后面的数进行比较,大的就交换位置,这样每一轮最大的就移动到了最后。
然后第二轮找第二大的数字,移动到倒数第二个位置。
for (int i = 0; i < arr_M.count; ++i) {
//遍历数组的每一个`索引`(不包括最后一个,因为比较的是j+1)
for (int j = 0; j < arr_M.count-1; ++j) {
//根据索引的`相邻两位`进行`比较`
if (arr_M[j] < arr_M[j+1]) {
[arr_M exchangeObjectAtIndex:j withObjectAtIndex:j+1];
}
}
}
13.选择排序
它的工作原理是每一次从待排序的[数据元素]中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)。
NSMutableArray *arr_M = [NSMutableArray arrayWithObjects:@1,@4,@2,@3,@5,nil];
for (int i=0; i