IOS一些随手笔记

178 阅读5分钟

开发中的一些随手笔记,记录到这里,不定时更新

1.浅复制和深复制的区别

浅复制:只复制对象的指针 而不复制对象的本身(浅复制好比你和你的影子,你完蛋 你的影子也完蛋)

深复制:复制引用对象本身(深复制好比你和你的克隆人,你完蛋,你的克隆人还活着)

2.类别的作用?继承和类别在实现中有何区别?

category可以在不获悉 不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改,并且如果类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级,类别有三个作用:

(1)将类的实现分散到多个不同文件或多个不同框架中

(2)创建对私有方法的前向引用

(3)向对象添加非正式协议

继承可以增加,扩展父类方法,并且可以增加属性

3.类别和类扩展的区别

category和extension的不同在于后者可以添加属性,另外后者添加的方法是必须要实现的,extension可以认为是一个私有的category

4.什么是野指针

野指针就是指向一个被释放或者被回收的对象,但是指向该对象的指针没有做任何修改, 以至于该指针指向的是已经回收后的内存地址

5.UIView不接受触摸事件的几种情况

UIView不接受触摸事件的话,先去查看子控件有没有以下几种情况,然后再去看父控件有没有以下几种情况

(1)不接受用户交互 userinteractionEnables = NO

(2)是否隐藏 hidden = YES

(3)透明度是否为0 alpha = 0.0~0.01

(4)父控件是否不能接受事件

(5)是否超出了父控件的大小

6.copy与Strong

在修饰可变字符串时,使用copy为深拷贝,会生成一个新的内存地址,而使用Strong为浅拷贝,内存地址还是指向原来那个对象

在修饰不可变字符时,使用copy和Strong都不会生成新的内存地址

如果说是修饰不可变字符串,我一般使用Strong

7.weak与assign的区别

weak与assign的区别主要在于修饰OC对象的时候的差异,assign一般用来修饰基本数据类型,例如:int,float,BOOL,而weak主要用来修饰OC对象,例如:UIButton,UIView,通过可以使用weak来解决Block中循环引用的问题

8.懒加载

第一次用到时才加载,而且只加载一次,是通过属性的Get方法来实现的

9.instancetype和id的区别

两者都属于万能指针,但是仍然有区别,区别主要体现在,instancetype能够动态的区分当前对象的数据类型,进行编译检测,而id就不行

(1)instancetype只能用于返回值,不能作为参数

(2)id类型在对象方法中,也是可以动态检测对象类型的

10.代理模式的使用场景

当一个类的某些功能需要被别人来实现,但是即不明确是些什么功能,又不明确谁来实现这些功能的时候,这个时候就可以用代理

11.== isEqualToString isEqual的区别

(1)==,比较的是两个指针的值(比较内存地址是否相同)

(2)isEqualToString,比较的是两个字符串是否相等

(3)isEqual是判断两个对象在类型上和值上是否都一样

12.APNS的基本原理

基本过程

(1)第一阶段:应用程序的服务器端把要发送的消息,目的iPhone的标识打包,发送给APNS

(2)APNS在已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发送到iPhone

(3)iPhone把发来的消息传递给相应的应用程序,并且按照设定弹出Push通知

13.Static有什么作用

Static关键字可以修饰函数和变量,作用如下:

1.隐藏 通过Static修饰的函数或者变量,在该文件中,所有位于这条语句之后的函数都可以访问,而其他文件中的函数不可以访问

2.静态变量 类方法不可以访问实例变量(函数),通过Static修饰的实例变量(函数),可以被类方法访问

3.持久 Static修饰的变量,能且只能被初始化一次

4.默认初始化 Static修饰的变量,默认初始化为0

14.如何理解KVO和KVC

KVO的本质

  1. KVO全称Key-Value-Observing
  2. KVO观察一个对象的属性,注册一个指定的路径,若这个对象的属性被修改,则KVO会自动通知观察者,KVO是一个观察者模式

KVC的本质:键值编码,是一种间接访问实例变量的方法。

15.Block

解决Block的循环引用,是因为有两个对象分别强引用,所以需要使用一个弱引用来解决这个问题

Block的作用:

Block是一种数据类型,用于保存代码

什么时候使用Block,代码块当作参数进行传递时使用Block

当某一个方法当中,某一部分代码不确定的时候,此部分代码可以通过外界传入(使用Block)

16.nonatomic与atomic的区别

nonatomic:非原子属性,线程不安全的(内部是不会加锁的)性能好

atomic:原子属性,线程安全的(内部会对Set方法加锁) 性能较差

17.@property

@property内部会做三件事情

1.提供一个带下划线的变量

2.提供一个GET方法

3.提供一个SET方法

18.extern

使用extern声明一个全局变量,它用于告诉编译器:“你现在编译的文件中,有一个标识符虽然没有在本文件中定义,但是它是在别的文件中定义的全局变量,你要在其它文件内查找!”