自动释放池
- 自动释放池的原理
- 存入到自动释放池中的对象,在自动释放池销毁的时候,会自动调用存储在该自动释放池的所有对象的release方法
- 可以解决的问题:将创建的对象,存入到自动释放池之中,就不需要手动的release这个对象了。因为池子销毁的时候,会自动的调用池中所有的对象的release方法。
- 自动释放池的好处:将创建的对象存储到自动释放池中,不用再写release
- 如何创建自动释放池
@autoreleasepool
{
person *p1 =[person new];
[p1 autorelease]//将p1对象存储到自动释放池。
}
- 注意
- 只有输出[p1 autorelease]才hui j会将对象存储在自动释放池
- 对象的创建位置不重要,但是[p1 autorelease]一定要在自动释放池中
- 自动释放池结束不是销毁对象,而是发送一条release消息
- 如果在自动释放池中调用多次,则每一次都会发送一条release消息,就会出现僵尸对象错误。
- 自动释放池唯一的作用:省略创建对象匹配的那个release。
类方法的两个规范
- 类方法的第一个规范:
- 一般情况下,要求提供与自定义方法相同功能的类方法,这样可以快速的创建一个对象。
- 一般情况下,写一个类,会为我们的类写一个同名的类方法,用来让外界叫用类方法来快速的得到一个对象(使用类方法得到的对象,要求这个对象已经被autorelease过了)
//实现
+(instancetype)bookWithName:(NSString *)name andPublisherName:(NSString *)publisherName andPublishDate:(Date)publishDate
{
return [[[self alloc] initWithName:name andPublisherName:publisherName andPublishDate:publishDate] autorelease];
}
//调用
@autoreleasepool {
Book *b2=[Book bookWithName:@"钢铁是怎样炼成的" andPublisherName:@"人民邮电出版社" andPublishDate:(Date){1998,12,12}];
}
ARC(自动管理内存)
- arc机制下,对象何时被释放
- 本质:对象的引用计数器为0的时候,自动释放
- 表象:只要没有强指针指向这个对象,这个对象就会立即回收
- ARC机制下永远不要写retain,release,autorelease这三个关键字。
- 强指针: __strong person *p1;
- 弱指针: __weak person *p1;
- 唯一区别: 如果一个对象没有任何强类型的指针指向这个对象的时候,对象就会被立即释放。
- 没有任何强指针指向的对象。
- 当指向对象的所有的强指针被回收的时候,对象就会被立即回收。
- 将所有指向对象的强指针赋值为nil的时候,对象就会被立即回收。
- 最重要的一点:不能创建对象就用一个弱指针存储这个对象的指针。
- 这样的话,刚创建出来的对象,就没有任何强指针指向,创建出来就会被回收。
- 在ARC机制下,当对象被回收的时候,原来指向这个对象的弱指针会被自动设置为nil。
- 如何控制@property生成的私有属性,是一个强类型的还是一个弱类型的?
@property(nonatomic,weak)Car *car
- 循环引用
- 让其中一端使用weak(两个强指针相互指向,会造成死锁)
- ARC和MRC相互兼容
- 在bulid phases 选项中的Complie Sources中,选择要使用成MRC的类,双击写入
-fno-objc-arc
- MRC转换为ARC
- 不安全方式:
选择edit->convert->to Objective-c ARC...
分类
- 让一个类占多个模块,功能相似的写在一个模块,方便维护和管理
- 添加的分类也分为声明和实现
//@interface 本类名 (分类名)
@interface User (itcast)
@end
@implementation User (itcast)
@end
- 分类的使用
- 如果要使用分类,要把分类的头文件引入
- 只能增加方法,不能添加属性
- 分类中可以写@property,但是不会自动生成私有属性,也不会自动生成getter和setter的实现。只会生成getter和setter的声明。需要自己写。
- 在分类的实现中不可以访问本类的真私有属性。但可以调用本类的setter和getter来访问属
- 有同名方法时,优先调用分类的方法,那怕没有引入分类的头文件,如果多个分类中有相同的方法,优先调用最后编译的分类。
非正式协议
- 为系统自带的类写分类,这个就叫做飞正式协议
- 分类的第2个作用
- 分类的作用
补充
- ARC机制和垃圾回收机制的区别
- Gc:运行时,扫描是否无人使用
- ARC:编译时,在合适的地方插入reatain,插入的代码足以让对象无人使用时,引用计数器为0.