首页 > 代码库 > autorelease、Block、Category、ARC

autorelease、Block、Category、ARC

1.autorelease方法的基本作用

  • 给对象发送一条autorelease消息, 会将对象放到一个自动释放池中
  • 当自动释放池被销毁时,会对池子里面的所有对象做一次release操作
  • 会返回对象本身
  • 调用完autorelease方法后,对象的计数器不变

 

autorelease的好处 :

  • 不用再关心对象释放的时间
  • 不用再关心什么时候调用release
  • autorelease的使用注意
  • 占用内存较大的对象不要随便使用autorelease
  • 占用内存较小的对象使用autorelease,没有太大影响

 

在iOS程序运行过程中,会创建无数个池子。这些池子都是以栈结构存在(先进后出)

当一个对象调用autorelease方法时,会将这个对象放到栈顶的释放池

自动释放池的创建方式

 iOS 5.0前  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; [pool release]; // [pool drain];

iOS 5.0 开始 @autoreleasepool {   }

 

2.Block的定义格式

返回值类型

(^block变量名)(形参列表) = ^(形参列表) {   };

调用Block保存的代码: block变量名(实参);

使用typedef定义Block类型: typedef 返回值类型 (^block类型名称)(形参列表);

 

3.Category:分类

  • 分类只能增加方法, 不能增加成员变量
  • 分类可以访问原来类中的成员变量
  • 如果分类和原来类出现同名的方法, 优先调用分类中的方法, 原来类中的方法会被忽略

方法调用的优先级(从高到低)

  • 分类(最后参与编译的分类优先)
  • 原来类
  • 父类

声明

#import "Student.h”

@interface Student (Study)

@end

实现

#import

"Student+Study.h”

@implementation

Student (Study)

@end

4.ARC的实现细节

  • 编译器会自动在适当的地方插入适当的retain、release、autorelease语句
  • 也就是说, 编译器会自动生成内存管理的代码, 不用程序猿手动编写
  • 如果是手动管理内存, 可以简称MRC (Manual Reference Countin ARC的判断原则
  • 只要还有一个强指针变量指向对象,对象就会保持在内存中
  • 强指针,被__strong修饰的指针,默认所有指针变量都是强指针 弱指针,被__weak修饰的指针
  • 不能调用release、retain、autorelease、retainCount 可以重写dealloc,但是不能调用[super dealloc]

 

ARC中的@property

  • strong : 用于OC对象, 相当于MRC中的retain
  • weak : 用于OC对象, 相当于MRC中的assign
  • assign : 用于基本数据类型, 跟MRC中的assign一样
  • copy : 一般用于NSString, 跟MRC中的copy一样