iOS重要知识点回顾整理
一、tableView 优化
1、使用reuseIdentifier,重用Cells。
纯代码重用直接创建,xib重用UINib需要注册一下,再取出来使用。
2、heightForRowAtIndexPath:中缓存行高。
3、异步加载图片,使用 SDWebImage
4、预创建所有的子视图,使用hidden属性控制视图是否展示。
5、不要使用半透明的颜色
6、在图像内容不变的情况下使用栅格化, 对连续不断使用的图片进行缓存。
shouldRasterize = YES;复制代码
7、异步绘制
8、不要将tableview的背景颜色设置成一个图片
二、内存管理
1、通过引用计数器(rentainCount)的机制来决定对象是否释放。每次runloop完成一个循环的时候,都会检查对象的retainCount,如果retainCount为0,说明该对象没有地方继续使用了,可以释放掉了。
2、内存管理的原则
只要还有人在使用这个对象,那么这个对象就不会被回收
● 只有你想使用这个对象,那么就应该让这个对象的引用计数器加1
● 当你不想使用这个对象时,应该让对象的引用计数器减1
● 谁创建,就由谁来release 。 如果你通过alloc, new, copy来创建-一个 对象,当你不想用这个对象的时候就必 须调用release或者autorelease让引用计数器减1 。 不是你创建的就不用你负责release
● 谁retain谁release 。只要你调用了retain,无论这个对象如何生成,都需要调用release
● 总结: 有加就应该有减,曾让某个计数器加1,就应该让其在最后减1
三、KVC-KVO
1、KVC的底层实现?
当一个对象调用setValue方法时,方法内部会做以下操作:
①检查是否存在相应key的set方法,如果存在,就调用set方法
②如果set方法不存在,就会查找与key相同名称并且带下划线的成员属性,如果有,则直 接给成员属性赋值
③如果没有找到_ key, 就会查找相同名称的属性key,如果有就直接赋值
④如果还没找到,则调用valueForUndef inedKey :和setValue :forUndef inedKey: 方法。 这些方法的默认实现都是抛出异常,我们可以根据需要重写它们。
2、KVO的底层实现?
KVO基于runtime机制实现。使用了isa混写(isa-swizzling) ,当一个对象(假设是person对象, person的类是MYPerson )的属性值(假设person的age)发生改变时,系统会自动生成一个类,继承自MYPerson : NSKVONot ifying_ MYPerson,在这个类的setAge方法里面,调用 [super setAge:age]、 [self willChangeValueForKey:@”age”] 和[self didChangeValueForKey:@ “age” ] ,而这两个方法内部会主动调用监听者内部的- (void )observeValueForKeyPath 这 个方法。 想要看到NSKVONotifying_ MYPerson很简单,在self.person.age = 20; 这里打断点,在调试区域就能看到person- >NSobject- > isa= (Class )NSKV0Notifying_ MYPerson.同时我们在self. person = [ [MYPerson alloc ] init] ;后面打断点,看到person ->NSObject- > isa= (Class )MYPerson,
由此可见,在添加监听者之后,person类型已经由MYPerson 被改变成NSKVONotifyingMYPerson。
四、Block
1、block的变量传递
如果block访问的外部变量是局部变量那么就是值传递,外界改了,不会影响里面
如果block访问的外部变量是_block或者static修饰,或者是全局变量,那么就是指针传递block里面的值和外界同-一个变量,外界改变里面也会改变
2、block注意点
在block内部使用外部指针且会造成循环引用情况下,需要用_ weak修饰外部指针 ___weak typeof(self) weakself = self;
在block内部如果调用了延时函数还使用弱指针会取不到该指针,因为已经被销毁了,需要在block内部再将弱指针重新强引用一下__strong typeof(self) strongSelf = weakSelf;
如果需要在block内部改变外部变量的话,需要在用_block修饰外部变量
五、生命周期
1、alloc 创建对象分配空间
2、init(initWithNibName)初始化对象,初始化数据
3、loadView 从nib中载入视图
4、viewDidLoad 视图在完成,可以进行自定义数据或者动态创建其他控件
5、viewWillAppear 视图即将出现在屏幕前
6、viewDidAppear 视图已经出现在屏幕前
7、viewWillDisappear 视图即将从屏幕上呗移除
8、viewDidDisappear 视图已经从屏幕上移除
9、dealloc 视图被销毁
六、 app的启动过程
分为有storyboard和没有storyboard的两种情况
1、main函数
2、UIApplicationMain
*创建UIApplication对象
*创建UIApplication的delegate对象
** 有storyboard的情况
3、根据Info.plist获得Main.storyboard的文件名,加载Main.storyboard
*创建UIWindow
*创建UIWindow的rootViewController
*显示窗口
** 没有storyboard的情况
3、delegate会监听系统对象,程序启动完毕的时候会调用代理
*-application:didFinishLaunchingWithOptions: 方法
*在代理方法中创建UIWindow对象
*创建UIWindow的rootViewController
*显示窗口
未完待续。。
还没有评论,来说两句吧...