记录一下 相关细节
- 什么时候使用copy
1、属性声明为copy — 一些具有可变子类的对象(NSstring ,NSDictionary,NSArray等)
copy 声明的不可变对象 用其可变子类去赋值 则会进行一次深copy,从新生成一个变量,这样当改变其可变赋值时, 该对象不会改变
copy 声明的不可变对象 用同样为不可变对象去赋值 则会进行一次浅copy(跟strong 没区别,其引用计数器+1)
2、block 的声明
当block使用外部变量的时候,系统给block分配内存在栈区,栈区内存由系统管理,随时可能被释放,当我们继续使用block时可能访问野指针。当我们用copy修饰时,系统会将block copy到堆区,内存释放由开发者自己管理,不会出现上述野指针问题。
- 哪些时候出现循环引用
1、NSTimer
定时器使用时设置target会使用self 通常我们使用NSTimer时都会把它加入到一个runloop中
runloop会对self对象做强引用 self的引用计数器+1 ,当我们没有把timer从runloop中释放出来时 self就会保持引用计数器的个数
timer认为调用方(self代表对象)被析构时会进入dealloc,在dealloc可以顺便将timer的计时停掉并且释放内存;但是从(self对象)的角度,他认为timer不停止计时不析构,那我永远没机会进入dealloc。
如何避免:当我们要离开该页面时 在viewWillDisappear或者viewDidDisappear 中调用 [timer invalidate]2、 block(待补充)
block使用中经常会使用到其所属的对像
self.block = ^(){
self.*;
};
一般修饰block我们使用copy

3 delegate
代理在使用的时候一般我们申请为weak
一般delegate设置为包含该空间的父控件,存在着 父控件强引用子空间,子空间的delegate又是父控件的情况
当我们把delegate属性声明为strong时就形成一个引用循环,导致内存泄露,如果设置成weak则不会出现这种情况
如图
- 如何查找循环引用
每个页面重写dealloc方法,页面消失时看是否调用该方法
用xcode 提供工具 profile
- NSArray与NSSet的区别
NSArray 是一个有序的队列,可以存放同一个对象多次
NSSet 无序 且不能重复存放同一个对象
- NSArray内存分配上是怎样的
暂时搁浅
NSDictionary如何有序排列
UITableView针对cell不定高度如何优化性能
- SDWebImage 如何区分在cell不断变化model的情况下显示图片
- NSURLCache 的使用特点
- delegate 属性声明设置为strong 会产生内存泄露么?为甚要使用weak进行声明
- http 返回code含义
- 常用加密算法使用场景