1. Category
Category是给原有类增加方法的,不能增加属性
分类中的@property只会生成getter.setter的声明,不会生成方法的实现及成员变量。
分类可以访问原有类.h中声明的属性
如果一个分类有一个方法和原类方法名相同,那么用原类调用该方法是,实际调用的是分类的方法。
如果多个分类有和原类相同的方法,那么调用时由编译器决定调用哪个。会调用最后一个参与编译的分类中的方法。
2. Extension
可以为类扩充私有的成员变量和方法
写在.m中
@interface 类名 ()
@end
3. Block
Block是iOS一种特殊的数据类型,用来保存某一段代码,在需要的时候再取出来调用
返回值类型 (^blockName)(形参列表); blockName = ^(形参列表){ 代码}; //保存代码
blockName = ^{}
block(); //调用
typedef int (^sumBlock)(int,int); sumBlock = ^(int num1, int num2){ return num1+ num2;}; sumBlock(2,3);
block可以访问外界变量,也可以定义和外界变量相同的变量名,但是默认情况下不能修改外界变量(a传值)
block访问了外界的变量,block会将该外界变量拷贝一份到堆内存中
int a = 10; void (^block)() = ^{ NSLog("%i", a); //拷贝了一份a=10到堆内存 }; a = 20; block(); //此时打印的是10
block如若要修改外界变量的值,需要在外界变量前加__block.此时如果block修改了外界变量的值,那么会影响到外界变量的值(地址传值&a)
默认情况下,block