1、MRC和ARC
MRC :Manul Reference Counting (手动引用计数)
ARC :Automatic Reference Counting (自动引用计数)
iOS 5以后,苹果提供的ARC机制
ARC 是编译器特性,编译器在适当的时候,在我们写代码中插入内存管理代码
2、强指针和弱指针
强指针(强引用):
默认情况下,所以的指针都是强指针(__strong)
弱指针(弱引用):(__weak)
不会影响对象的生命周期,对象的生死与弱指针没有关系
ARC中内存管理原则:只要有强指针指向这个对象,这个对象就不会被销毁
只要没有强指针指向这个对象,这个对象就会立即被销毁
3、@property修饰符
-> MRC 关于内存管理的修饰符
assign 没有内存管理的代码(非OC对象,循环retain)
retain 有内存管理的代码(OC对象)
copy 适用于NSString
-> ARC下内存管理修饰符
strong 相当于MRC中的retain(OC对象,表示有一个强指针指向这个对象)
weak 相当于MRC中的assign(OC对象,表示有一个弱指针指向这个对象)
assign 用于非OC对象(基本数据类型,枚举,结构体)
copy 适用于NSString
4、循环引用
当对象之间的强引用构成环状,那么环内的所有对象都不能释放,这种情况下称为循环强引用
解决方法:一端用strong 一端用weak
5、ARC注意点:
在ARC下不能使用内存管理的代码(即不能调用retain,release,autorelease)
在ARC下可以重写dealloc方法,但是在dealloc方法内部不能调用super deallic
当一个对象作为方法的返回值的时候,系统会自动把这个对象放到自动释放池中
当自动释放池被销毁的时候,对象被销毁
6、Category (分类)
->作用:在不改变原有类的基础上扩展一个类的功能(方法)
->注意点:
分类只能扩展方法,不能增加成员变量。
分类中不能使用@property
在一个类的分类中可以直接访问原来类的私有成员变量
只有在.h文件中声明的成员变量才可以被访问
通过@property生成的私有成员变量,不能在分类中直接使用,setter和getter生成和实现是在.m文件中,可以通过self.成员变量 来调用
在分类中增加的方法是可以被子类继承的,也就是说在分类增加的方法在它所有的子类中都可以使用
不要在分类中增加与原有类同名的方法
如果分类中有与父类同名的方法,那么就不会执行父类中实现的方法,而是执行分类中的方法
扩充同一个类的不同的分类中也不要有同名的方法
如果不同的分类中,有相同的方法,就会执行最后编译的那个分类的方法
7、协议
非正式协议:给NSObject增加一个只有声明没有实现的分类就是非正式协议
谁需要这个方法,谁去实现这个方法
8、类扩展
格式:
@interface 原来的类名 ()
// 声明属性,成员变量,方法
@end
作用:为一个类增加私有属性,成员变量,方法
9、Block的基本使用
Block是一种特殊的数据类型,与函数或方法类似,都是用来保存一段代码
无论是方法还是函数他们都有
返回值类型 方法(函数)名称 形参列表 方法或函数体
Block也是由这几部分组成的
-> 无参无返回值的Block
定义变量
格式:void (^block变量名称)();
定义实现
格式:^{
语句;
...
};
-> 无返回值有参数的Block
定义变量
格式: void (^block变量名称)(参数类型 参数名称,...)
定义实现
格式:^(参数类型 参数名称,...){ 语句;...};
-> 有参有返回值的Block
定义变量
格式: 返回值类型 (^block变量名称)(参数类型 参数名称,...)
定义实现
格式:^返回值类型 (参数类型 参数名称,...){ 语句;...};
10、使用typedef与Block的使用步骤
1)定义Block变量的语句拷贝到typedef后面,这个时候这个变量名称就是这种Block类型
2)把原来的变量名称修改为我们想要的数据类型的名称
3)就可以使用这个数据名称定义这种类型的变量