1.根据cell上的子控件获取cell的IndexPath
当然是使用正规的办法获取indexPath值!如何做呢?
- (void)deleteButtonPress:(UIButton*)sender{//首先获得Cell:button的父视图是contentView,再上一层才是UITableViewCellUITableViewCell *cell = (UITableViewCell *)sender.superview.superview; //然后使用indexPathForCell方法,就得到indexPath了~NSIndexPath *indexPath = [_tableView indexPathForCell:cell];}
2.RunLoop主要处理Observer事件,runloop中状态变化时进行通知。需要注意,
Block事件,非延迟的NSObject PerformSelector立即调用,dispatch——after立即调用,block回调。
IOS为什么必须在主线程中操作UI
因为UIKit不是线程安全的。
两个线程同时设置同一个背景图片,那么很有可能因为当前图片被释放了两次而导致应用崩溃。
两个线程同时设置同一个UIView的背景颜色,那么很有可能渲染显示的是颜色A,而此时在UIView逻辑树上的背景颜色属性为B。
UIView 的 Layer在系统内部,被维护着三份同样的树形数据结构,分别是:
- 图层树(这里是代码可以操纵的,设置属性的最终值会立刻在这里更新);
- 呈现树(是一个中间层,系统就在这一层上更改属性,进行各种渲染操作。比如一个动画是更改alpha值从0到1,那么在逻辑树上此属性会被立刻更新为最终属性1,而在动画树上会根据设置的动画时间从0逐步变化到1);
- 渲染树(其属性值就是当前正被显示在屏幕上的属性值);
IOS 内存泄露
内存泄露会导致:由于内存资源不足发生难以排查的线上bug
性能问题,会导致app越来越卡
如果是ViewController发生内存泄露,重点查看ViewController里面的block是否忘记声明weak了,因为view controller被其他对象持有的情况不常见。
最常发生的是View的内存泄露问题,首先查看是发生内存泄露的view之间是否有delegate的关系,如果有的话看看delegate属性有没有声明weak
由于service或者读取缓存灯异步操作引起的内存泄露问题
4.
runloop 实现的功能
1.AutoreleasePool
2.事件响应
3.手势识别
4.界面更新
5.定时器
Run Loop的实际应用举例
AFN
AsyncDisplayKit
runloop的概念
一般来讲,一个线程一次只能执行一个任务,执行完成后线程就会退出,让线程能随时处理事件但并不退出,比如node.js的事件处理,如何管理事件,如何让线程在没有处理消息时休眠以避免资源占用,在消息到来时立刻被唤醒。
6.
runtime笔记
1.对象拷贝: id object_copy(id obj,size_t size)
2.对象释放 id object_dispose(id obj)
3.更改对象的类/获取对象的类 Class object_setClass(id obj,Class cls)/ Class object_getClass(id obj)
4.获取对象的类名 conschar*object_getClassName(id obj)
5.给一个类添加方法 BOOL class_addMethod(Class cos,SEL name,IMP imp,const char*types)
6.获取一个类的所有方法
7.获取一个类的所有属性
8.获取/设置类的属性变量
9.判断类的某个属性的类型
10.通过属性的值来获取其属性的名字
11.系统类的方法实现部分替换
12.自定义类的方法实现部分替换
13.覆盖系统方法
14.自动序列化
15.用C代替OC