iOS重要知识点回顾整理

深碍√TFBOYSˉ_ 2022-01-20 06:13 418阅读 0赞

一、tableView 优化

1、使用reuseIdentifier,重用Cells。

纯代码重用直接创建,xib重用UINib需要注册一下,再取出来使用。

2、heightForRowAtIndexPath:中缓存行高。

3、异步加载图片,使用 SDWebImage

4、预创建所有的子视图,使用hidden属性控制视图是否展示。

5、不要使用半透明的颜色

6、在图像内容不变的情况下使用栅格化, 对连续不断使用的图片进行缓存。

  1. 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

*显示窗口

未完待续。。

发表评论

表情:
评论列表 (有 0 条评论,418人围观)

还没有评论,来说两句吧...

相关阅读

    相关 合同法重要知识

    合同法重要知识点 1、合同是指平等主体的自然人、法人、其他组织之间设立、变更、终止民事权利义务关系的协议。 政府的经济管理活动、企业、单位内部的管理关系不适用《合同法》。

    相关 知识整理

    知识点整理 1、动态路由协议ospHf有哪几种报文,分别描述下作用。 2、为什么要使用本地端口镜像和远程端口镜像配置。 3、网络地址转换NAT原理、分类