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

*显示窗口


未完待续。。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值