ARC与分类


自动释放池

  1. 自动释放池的原理
  • 存入到自动释放池中的对象,在自动释放池销毁的时候,会自动调用存储在该自动释放池的所有对象的release方法
  • 可以解决的问题:将创建的对象,存入到自动释放池之中,就不需要手动的release这个对象了。因为池子销毁的时候,会自动的调用池中所有的对象的release方法。
  • 自动释放池的好处:将创建的对象存储到自动释放池中,不用再写release
  1. 如何创建自动释放池
@autoreleasepool
{
person *p1 =[person new];
[p1 autorelease]//将p1对象存储到自动释放池。
}
  1. 注意
  • 只有输出[p1 autorelease]才hui j会将对象存储在自动释放池
  • 对象的创建位置不重要,但是[p1 autorelease]一定要在自动释放池中
  • 自动释放池结束不是销毁对象,而是发送一条release消息
  • 如果在自动释放池中调用多次,则每一次都会发送一条release消息,就会出现僵尸对象错误。
  • 自动释放池唯一的作用:省略创建对象匹配的那个release。

类方法的两个规范

  1. 类方法的第一个规范:
  • 一般情况下,要求提供与自定义方法相同功能的类方法,这样可以快速的创建一个对象。
  • 一般情况下,写一个类,会为我们的类写一个同名的类方法,用来让外界叫用类方法来快速的得到一个对象(使用类方法得到的对象,要求这个对象已经被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(自动管理内存)

  1. arc机制下,对象何时被释放
  • 本质:对象的引用计数器为0的时候,自动释放
  • 表象:只要没有强指针指向这个对象,这个对象就会立即回收
  1. ARC机制下永远不要写retain,release,autorelease这三个关键字。
  2. 强指针: __strong person *p1;
  3. 弱指针: __weak person *p1;
  • 唯一区别: 如果一个对象没有任何强类型的指针指向这个对象的时候,对象就会被立即释放。
  1. 没有任何强指针指向的对象。
  • 当指向对象的所有的强指针被回收的时候,对象就会被立即回收。
  • 将所有指向对象的强指针赋值为nil的时候,对象就会被立即回收。
  1. 最重要的一点:不能创建对象就用一个弱指针存储这个对象的指针。
  • 这样的话,刚创建出来的对象,就没有任何强指针指向,创建出来就会被回收。
  1. 在ARC机制下,当对象被回收的时候,原来指向这个对象的弱指针会被自动设置为nil。
  2. 如何控制@property生成的私有属性,是一个强类型的还是一个弱类型的?
  • 使用参数 ,strong和weak
@property(nonatomic,weak)Car *car
  1. 循环引用
  • 让其中一端使用weak(两个强指针相互指向,会造成死锁)
  1. ARC和MRC相互兼容
  • 在bulid phases 选项中的Complie Sources中,选择要使用成MRC的类,双击写入-fno-objc-arc
  1. MRC转换为ARC
  • 不安全方式:选择edit->convert->to Objective-c ARC...

分类

  1. 让一个类占多个模块,功能相似的写在一个模块,方便维护和管理
  2. 添加的分类也分为声明和实现
//@interface 本类名 (分类名)
@interface User (itcast)

@end
@implementation User (itcast)

@end
  1. 分类的使用
  • 如果要使用分类,要把分类的头文件引入
  • 只能增加方法,不能添加属性
  • 分类中可以写@property,但是不会自动生成私有属性,也不会自动生成getter和setter的实现。只会生成getter和setter的声明。需要自己写。
  • 在分类的实现中不可以访问本类的真私有属性。但可以调用本类的setter和getter来访问属
  • 有同名方法时,优先调用分类的方法,那怕没有引入分类的头文件,如果多个分类中有相同的方法,优先调用最后编译的分类。

非正式协议

  1. 为系统自带的类写分类,这个就叫做飞正式协议
  2. 分类的第2个作用
  • 为已经存在的类添加方法
  1. 分类的作用
  • 将臃肿的类分为多个模块, 方便管理
  • 扩展一个类

补充

  1. ARC机制和垃圾回收机制的区别
  • Gc:运行时,扫描是否无人使用
  • ARC:编译时,在合适的地方插入reatain,插入的代码足以让对象无人使用时,引用计数器为0.
学习