1.当一个控件要加到父容器的时候调用willMoveToSuperview
willMoveToSuperview和 layoutSubview的区别
1)当将这个控件真正添加到父控件的时候会调用这个方法设置当前控件的所有子控件frame.—layoutsubview
2)当当前控件添加到父控件时调用这个方法 ---willMoveToSuperview
2.scrollView 的contenOffset和contentInser的区别
contenOffset设置内容的默认间距
contentInser是滚动之后的内容的间距
3.默认情况下,不能直接对通过读取plist的数组进行修改
因为它默认是NSArray类型,不能删除或修该
4.NSTimer
timerWithTimeIntervalxxx,并不会自动添加到运行环中,意味着它的时钟不会自动开启
scheduledTimerWithIntervalxxx;它会以默认的方式添加到线程运行环中自动运行,有一个缺点.当有其他操作执行的时候,它会暂时停掉,直到其他的方法执行完毕才恢复
定时器会强引用target直至定时器被销毁,所以控制器不会销毁,导致内存泄露
需要自定义的类,使定时器对自定义的类进行强引用,自定义的类对控制器进行弱引用,才不会造成内存泄露
5.UITableView的行高确定
ios9以后:方法的流程—先调用设置行高的方法—调用创建cell的方法—再调用设置行高的方法(有预估值的话就不会先调用第一步)
ios9以前:没有第三步.
6.自动布局
autolayout— 能根据任意控件之间的关系来设置位置
autoresizing—只能根据父容器来设置frame值
size classes + autolayout 可以为不同尺寸的屏幕 通过autolayout设置不同的约束
autoresizing和autolayout二者是互斥的,只能使用其中一种
7.状态栏
在iOS7之后,状态栏样式默认交给控制器管理,之前是由UIApplication管理的,如需改回来,交回给application管理,则在info文件设置
8.toolbar中的UIBarButtonItem:
- (instancetype)initWithTitle:(nullable NSString *)title style:(UIBarButtonItemStyle)style target:(nullable id)target action:(nullable SEL)action;
style 的三种样式,没差别,因为ios7以后扁平化了
9.UIPickView
设值cell里面内容字符串的属性,该方法的优先级比单纯返回字符串的高
10.在OC中,方法内部会对方法调用者进行一次强引用
11.手势冲突:
[panGestureRecognizer requireGestrureRecognizerToFail:leftSwipe]
处理方法:
一个控件可以添加多个手势,一个手势只能作用在一个控件上
手势优先级的原因,从staus属性可以查看手势识别的优先级
11.核心动画的缺点:
1).核心动画是一个假象
2).不能回到原来的位置
12.不能在遍历数组的同时,删除数组中的元素..会崩溃—解决方法,在循环外删除
13.如何选择加载图片的方法
- 图片使用频繁而且比较小的图片,使用imageNamed
- 图片使用不频繁而且比较大的图片,使用imageWithContentsOfFile:
14.线程的销毁
正常的死亡用return,强制的退出用[NSThread exit] (在该方法使用前,记得要先释放资源,同时不能在主线程中执行该代码)
15.线程的安全自旋锁和互斥锁的相同点和区别
苹果官方建议使用非原子性,不建议多个线程同时访问同一个属性,大部分UI控件都不是线程安全的,苹果约定:所有跟UI相关的操作必须在主线程上执行,为了性能和效率.
相同点:都能保证锁住的代码同一时间只有一个线程执行
不同点:
- 互斥锁:如果锁住的代码有其他的线程在执行,等待的线程会进入休眠的状态,一旦锁被解开,则等待的线程会马上唤醒
- 自旋锁:如果锁住的代码有其他的线程在执行,等待的线程会以死循环的方式等待锁,一旦锁被解开,则马上执行锁住的代码
16.+(void)initialize 和 +(void)load方法的使用
- 当类加载的时候调用,只要是使用#import导入类,就会调用类的方法+(void)load
- 当第一次使用到该类或该类的子类时调用,如果子类没有重写该方法,父类的该方法会被调用多次 +(void)initialize
17.view的edge
在iOS 7中,苹果引入了一个新的属性,叫做[UIViewController setEdgesForExtendedLayout:],它的默认值为UIRectEdgeAll。当你的容器是navigation controller时,默认的布局将从navigation bar的顶部开始。这就是为什么所有的UI元素都往上漂移了44pt。
18.位移枚举
当要传一个位移枚举的时候,如果不关心类型的话,直接传值0,效率会更高,因为判断内部前面应该会先有一个对0 的判断,如果为0,直接返回,不进行下面的判断
19.清空字符串
清空字符串,不能直接赋值nil,因为可变字符串是懒加载,如果赋值为nil,会导致循环创建(字符串为可变字符串)
20.后台返回的数据
如果后台数据的名称是id,我们可以照样使用id,不用担心跟关键字重复,不能返回nil
21.命名
在iOS7之后,属性命名不能用new,copy,retain等单词开头,可以将首字母改为大写
22.控制器的父子关系
如果控制器的view互为父子关系,则控制器之间也必须互为父子关系,否则响应者链条会传递不了
21.collectionView
- collectionview的组数为0的时候就崩了,当collectionview的组数由模型决定,同时模型又是通过网络请求数据,异步子线程加载数据的时候.暂时的解决方法
22.
当用navigationcontroller push一个控制器入栈的时候,如果这个控制器的view没有背景颜色的时候,则切换控制器的时候就出现画面卡顿的现象:解决方法
给控制器的view设置背景颜色
23.用KVC对只读属性赋值
当针对某个类的属性的时候,该属性是只读,只能使用kvc赋值,暴力破解,调用的过程,
1)先找setTabBar()方法,能找到就直接调用这个方法,如果找不到
2)再找_tabBar成员变量
3)再_setTabBar()方法
4)再找tabBar的成员变量
24.文件命名
- 在项目文件中,不能以中文来命名,会报错,找不到文件,出现文件丢失
- 项目名称中产品名称出现中文,创建一个自定义数组,添加对象,会报错.打断点po得p的值为p,创建数组失败,解决方法:更改产品名称为中文名,
25.SDWebImaged的下载图片
从缓存中获取的图片图片是点坐标,点坐标 = 像素 / 2 (SDWebImage在3.7.3之后才会这样帮你处理),所以要恢复原来图片的大小,乘以当前屏幕的缩放系数
网友评论