一面【扫盲篇】
-(CGSize)intrinsicContentSize的作用?
1、Autolayout中作为UIview的只读属性
2、直译固有大小,如果没有指定控件的大小,需要重写相当于占位。
场景1: 系统导航内自定义view,需要重写改属性。否则大小会被导航栏改变。
场景2: UIImageView相关不指定图片,不设置本身大小,则回抛约束警告。
编写一个循环引用的代码?
循环引用(交叉引用属于其中一种):双方互相强引用对方
场景1: 设计代理时候,delegate的声明需要使用weak或者assign修饰。使用Strong则会产生循环引用。
场景2: A->B->C->D->A(大环引用)
场景3: Block内部持用外部属性,不实用__weak修饰
Assign和Weak区别?
Assign
-
修饰基本数据类型
- int
- float
- bool
-
修饰对象数据类型【不改变引用计数】
-
修饰的对象释放后,继续指向其地址,产生悬垂指针(野指针)
- 内粗泄漏
- 程序异常崩溃 【EXC_BAD_ACCESS】
Weak
-
仅修饰对象数据类型
- 不改变引用计数
- 对象释放后,自动设置为nil
-
延伸:
-
对象释放后为什么会被设置为nil?
-
1、当一个对象对销毁后执行dealloc
-
2、dealloc实现会调用一些列弱引用清除的函数[ojb4源码可以查看]
- dealloc
- objc_rootDealloc
- object_dispose
- objc_destructInstance
- objc_clear_deallocating
- weak_clear_no_lock
-
3、根据当前对象的指针查找弱引用表,把当前对象相对应的弱引用(数组)进行循环将其指针挨个设置为nil
-
-
延伸
-
读写相关
- readwrite[默认]
- readonly
-
原子性
-
atomic
-
赋值和获取是线程安全的
-
操作则可能不是【修饰数组】
- 场景1: 对数组的赋值和获取元素是安全的
- 场景2: 对数组的移除和新增元素则不是安全的
-
-
nonatomic
-
-
引用计数
-
retain【ARC】
-
MRC下重写Retain修饰变量的setter方法?
- -(void)setObj:(id)obj{ if (_obj != obj){[_obj release]; _obj = [obj retain]}}
- 如果源对象和传入的对象Obj不相等,则对源对象进行release操作,对新传入的对象进行retain操作再进行赋值。
- 进行!= 判断 (防止传入的对象刚好是原对象,则原对象删除了。在赋值就会出错)
-
-
strong【MRC】
-
assign
- 基本数据类型
- 对象数据类型
-
unsafe_unretained【MRC产物】
- 仅修饰对象数据类型
- 不自动设置为nil
-
copy
-
浅拷贝[指针copy]
-
例子:@property(copy)NSMutableArray * muArray;
-
浅拷贝是对内存地址的copy
-
即让copy对象和源对象的指针指向同一片内存空间
-
结论:
- 增加被copy对象的引用计数
- 没有新的内存空间分配
-
-
赋值
-
MutableArray
-
copy
-
Array
- 面上看着是可变数组,进行增删则会异常
-
-
-
Array
-
copy
-
Array
- 面上看着是可变数组,进行增删则会异常
-
-
-
-
-
深拷贝
-
和浅copy相反
-
copy对象和源对象的指针指向两片内容相同的内存空间
-
结论:
- 不增加被copy对象的引用计数
- 产生了新的内存空间分配
-
-
-
区别与联系
-
特点
- 是否开辟新的内存空间
- 是否改变源对象的引用计数
-
总结:
-
可变对象的copy/mutableCopy都是深拷贝
-
不可变对象
- copy[浅拷贝]
- mutableCopy【深拷贝】
-
copy方法返回的都是不可变对象
-
-
源对象类型
-
copy方式
-
copy对象类型
- copy类型[深/浅]
-
-
-
可变对象
-
copy
-
不可变
- 深拷贝
-
-
-
可变对象
-
mutableCopy
-
可变
- 深拷贝
-
-
-
不可变对象
-
copy
-
不可变
- 浅拷贝
-
-
-
不可变对象
-
mutableCopy
-
可变
- 深拷贝
-
-
-
-
-
IB拖线的时候为什么要设置为weak设置为strong行不行?
1、UIViewController的View属性是Strong[强拥有关系]
2、添加其他试图到View上通过IBOutlet方式
3、由View拥有它们【这里问的使用Weak还是Strong修饰】切入
Weak
- 当控件的父视图和想拥有相同的生命周期则使用
- 推荐Weak,因为MRC下系统会自动帮你管理内存
Strong
- 当控件的父视图销毁时、还想继续拥有这个控件就使用
UIView和UILayer的关系?
UIView
- 负责处理事件(触摸)
- 参与响应链
- 为其提供内容
联系
-
每个UIView内部都有一个CALayer与之对应
-
View的尺寸和样式都有Layer提供
-
两者都有树状结构
-
subViews
-
subLayers【较之View多了个AnchorPoint】
-
presentLayer tree动画树
- iOS在做动画的时候,修改的属性值就是其中的属性值
-
modelLayer tree模型树
- 最终展示在界面上
-
render tree渲染树
-
-
-
控件想要重新绘制
-
[UIView setNeedDispaly]
-
CALayer setNeedDisplay] [同名方法]
-
[CALayer dispaly]
-
代理响应
- 异步绘制入口
-
代理不响应
- 系统绘制流程
-
-
-
此时并未真正的绘制,需要当前RunLoop结束
-
-
CALayer
- 负责显示内容
- 修改属性,支持隐式动画
结束
XMind - Trial Version