二、知识点整理

1、什么是arc?(arc是为了解决什么问题诞生的?)

RAC自动引用计数,由编译器在代码合适的位置插入retain/release方法从而进行内存管理。(为了解决手动管理引用计数问题)。

RAC的要点:

  • 在对象被创建时 retain count +1,在对象被release时 retain count -1.当retain count 为0 时,销毁对象。 程序中加入autoreleasepool的对象会由系统自动加上autorelease方法,如果该对象引用计数为0,则销毁。
2、解释assign vs weak
  • assign 不会改变引用计数,通常用于非指针变量的基础数据类型直接赋值。
  • weak 弱引用,修饰对象类型,对象释放后被置为nil,避免错误的内存访问。
2.1、、assign为什么不用来修饰对象呢?
  • 指针a指向一块内存,这是把a赋值给了b。如果使用assign属性,a和b就指向同一块内存。若果这时a释放了,那么b在使用这块内存的时候就会carsh。
2.2、为什么基本数据类型用assign修饰?
  • 因为基本数据类型不是对象,在内存中创建和使用后,在一个方法结构体被删除,基本数据类型不需要引用计数,而其他修饰需要引用计数,所以用assign。
3、__block vs __weak
  • __block 修饰的局部变量才可以在block内部被修改。
  • __weak 修饰变量是弱引用。
3.1、__block在ARC和非ARC下含义一样吗?
  • 在MRC下的__block 相当于ARC下的__weak。
  • 在RAC下的__block是为了能在block内存修改变量。
4、UIView和CALayer是什么关系?
  • View能显示在屏幕上归功于layer。通过drawRect方法来渲染自身的内容,调解clayer属性可以调整UIVIew的外观,UIView继承字啊UIResponder,比起clayer可以响应用户操作。
  • UIView 是iOS 11系统中界面元素的基础,所有的界面元素都继承自它。它真正的绘图部分由CALayer管理。UIView更像是CALayer的管理器。
5、使用atomic一定是线程安全的吗?
  • atomic的作用是为了属性setter/getter方法加锁,避免多线程下访问setter/getter产生数据错乱。所以在访问setter/getter方法时线程安全的,而对于进行其他操作的多线程和atomic没有直接关系。
6、loadView 干嘛用的?
  • loadView 在View为nil时调用,早于ViewDidLoad,通常用于代码实现控件,收到内存警告时会再次调用。loadView默认做的事情是:如果此ViewController存在一个对应的xib文件,那么就加载这个nib文件。否则就创建一个UIView对象。
  • 如果想自己常见View对象,那么可以重载这个方法,此时你需要自己给View赋值。
7、+(void)load; +(void)initalize;有什么用处?
  • 如果父类和子类都调用,会先调用父类再调用子类。
  • load 在APP启动会自动会自动调用每个了你的 +load 方法会在didFinsihLaunchingWithOptions前调用。
  • +(void)initalize 则是在第一次主动使用这个类的时候调用。
  • load只会被调用一次。而 initalize 可能会被调用多次。
  • 在子类不是实现 initalize 方法,会调用父类的initalize方法。
8、HTTP协议中POST方法和GET方法有那些区别?
  • GET 用于向服务器请求你数据,POST用于提交数据。
  • GET 请求,请求参数会接拼在URl后面,暴露在地址栏。而POST请求则房租请求体里面。因此GET请求不适合用于验证密码等操作。
9、沙盒目录的结构?使用场景?

Document:常用目录,iCloud备份目录。 Libary: Caches:存放大体积,不需要备份的文件。 Preference:设置目录,iCloud会备份设置信息。 Temp:存放临时文件。

10、#define和const变量有什么区别?
  • define 在预处理阶段会进行简单的替换,const会在编译阶段使用。
  • define 不做类型检查。const 做类型检查。
  • define 不分配内存,仅仅展开替换。const 会分配内存空间。
  • define 不可调试。
  • define 定义的常量在替换后运行过程中不断的占用内存,而const定义的常量存储在数据段,只copy一份。效率更高。
  • define 可以定义一些简单的函数,const不可以。
11、TCP和UDP有什么区别?
  • TCP 是面向连接的,建立连接需要三次握手,保证数据正取性和数据顺序。
  • UDP 是非连接协议,传输数据受生成速度,传输带宽限制,可能造成丢包。
  • UDP 一天服务器可以同时向多个客户端传输信息。
  • TCP 报头体积更大,对系统资源要求更多。
12、请简述Responder Chain?(响应链)
  • 响应者对象:继承自UIResponder的对象,称为响应者对象。
  • 在iOS中,能够响应事件的对象是UIResponder的子类对象。 UIResponder提供了4个用户点击回调的方法,分别对应用户点击开始、移动、点击结束、取消点击,其中只有程序强制退出过着来电时,取消点击事件才会调用。
  • 在自定义UIView为基类的控件时,我们可以重写这几个方法来进行点击回调。在回调中,我们可以看到方法接收两个参数,一个UITouch对象的集合,还有一个UIEvent对象。这两个参数分别代表的是点击对象和事件对象。
  • 响应者链:响应者链:由多个响应者组成起来的链条,称为响应者链。
  • 在捕获UIEvent后,从AppDelegate-->UIAppcation-->UIWindow-->UIViewController-->UIView-->subView 进行查找。
  • 然后从subView 开始尝试响应这个时间,并传递给nextResponder,如果父节点不能想能则不继续往下传递。
  • 通过pointInside判断时间是否在本视图内,通过htiTest返回响应击事件的对象。
13、pushViewController和presentViewController有什么区别?
  • 两者都是多控制跳转的函数
  • presentViewController 提供的是一个模态视图控制器
  • pushViewController 提供一个栈控制器数组,(push/pop)。
14、使用drawRect有什么影响?
  • drawRect方法依赖Core Graphics框架来进行自定义的绘制,但这种方法主要的缺点就是它处理touch事件的方式:每次按钮被点击后,都会用setNeddsDisplay进行强制重绘;而且不止一次,每次单点事件触发两次执行。这样的话从性能的角度来说,对CPU和内存来说都是欠佳的。特别是如果在我们的界面上有多个这样的UIButton实例。

  • 这个方法的主要作用是根据传入的 rect 来绘制图像 参见文档. 这个方法的默认实现没有做任何事情, 我们可以在这个方法中使用 Core Graphics 和 UIKit 来绘制视图的内容.

  • 这个方法的调用机制也是非常特别. 当你调用 setNeedsDisplay 方法时, UIKit 将会把当前图层标记为 dirty, 但还是会显示原来的内容, 直到下一次的视图渲染周期, 才会为标记为 dirty 的图层重新建立 Core Graphics 上下文, 然后将内存中的数据恢复出来, 再使用 CGContextRef 进行绘制.

  • 相关参考:UIView的layoutSubviews和drawRect方法何时调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值