关于iOS,易反复忘记的几个小知识

  1. load和initialize

load

调用时机:load方法在这个文件被程序装载时调用。只要是在Compile Sources中出现的文件总是会被装载,这与这个类是否被用到无关,因此load方法总是在main函数之前调用。
调用顺序:继承体系按照 super-self-sub(多个按照文件编译顺序)-category(多个按照文件编译顺序),否则按照编译文件顺序。
使用场景:在load方法中实现Method Swizzle。
注意:load方法是线程安全的,它内部使用了锁,所以我们应该避免线程阻塞在load方法中。

initialize

调用时机:第一次实例化(alloc在堆上分配变量)被调用,因此总是在main函数之前调用。
调用顺序:super-self(self会调用最后一个category的init方法)
使用场景:initialize方法一般用于初始化全局变量或静态变量。
注意:本类的initialize不一定会被调用,因为可能是调用最后一个Category的。initialize方法同样是线程安全的。

  1. id,NSObject*和id;

id

id类型是运行时的动态类型,仅声明了指向对象的指针,没给编译器任何类型信息,因此,编译器不会做类型检查。
id类型是一个Objective-C对象,但并不是都指向继承自NSOjbect的对象,比如NSProxy就不从NSObject继承。

NSObject*

编译器会进行类型检查。

id

编译器会进行类型检查。id告诉编译器,你不关心对象是什么类型,但它必须遵守NSObject协议。一般用于代理。

  1. block
    block有下面三种类型

_NSConcreteGlobalBlock(全局块)

未捕获外部变量(含局部变量及self,不包含静态变量),将会被编译器编译为_NSConcreteGlobalBlock

_NSConcreteMallocBlock(堆块)

在捕获外部变量的前提下:
1.赋值给一个普通变量(ARC下)之后就会被 copy 到堆上
2.赋值给strong(ARC下) 和 copy 修饰的属性
3.作为函数的返回值

_NSConcreteStackBlock(栈块)

在捕获外部变量的前提下:
1.赋值给weak 和 assign 修饰的属性
2.作为函数参数传入

  1. Xcode拉伸图片
关于iOS,易反复忘记的几个小知识_第1张图片

在Slices属性中可以选择当前拉伸的类型,我们选择Horizontal and Vertical(水平和垂直拉伸),下面的Left,Right,Top,Bottom则分别代表左右上角保留的区域。Center属性代表中部的像素区域按哪种形式去拉伸,一种为Stretches(拉伸),一种为Tiles(平铺),width和Height代表中部像素区域的大小。除去中部区域和保留区域,剩下的区域就是被剪切的区域。

你可能感兴趣的:(关于iOS,易反复忘记的几个小知识)