OC 内存管理

OC 内存管理


iOS内存管理法

  • ARC Automatic Reference Counting 自动引用计数
  • MRC Manual Reference Counting 手动引用计数

反管理方式
(图片)
ACCESS 1

内存管理之问题

  • 内存泄露:不再需要之目标没放。
  • 野指针:正在使的靶子提前放。

援计数

  • 各级一个目标上都出一个援计数器
  • 当目标出生时引用计数器为1
  • 当目标调用retain方法时引用计数器+1
  • 当对象调用release方法时引用计数器-1
  • 当一个目标引用计数为0时,这个目标就给回收

僵尸对象(BAD_ACCESS错误)

哟是僵尸对象???

  • 多度释放的靶子

什么是BAD_ACCESS错误???

  • 做客僵尸对象的成员变量或者为僵尸对象发消息

什么缓解者的星星只问题????

(一)通过 Zombie
图片:
ACCESS 2

(二)Xcode7集成了BAD_ACCESS捕获功能:Address Sanitizer。
图片:
ACCESS 3

dealloc方法

  • 当目标的retainCount=0时自动调用。
  • dealloc里release成员变量对象。
  • dealloc必须调用父类方法,[super dealloc]总得在最后。
  • dealloc由网活动调用,不能够手动调用。
  • dealloc的优化 self.xxx= nil;

内存管理标准

  • 谁申请,谁释放。
  • 报名之主意:alloc new copy mutableCopy retain
  • 自由的法门:release

Autorelease

(一)基本用法

  • 见面将对象放置一个活动释放池中
  • 当自动释放池被灭绝时,会针对池塘里之享有目标做一样蹩脚release
  • 见面回来对象自我
  • 调用完autorelease方法后,对象的计数器不让影响(销毁时影响)

(二)好处

  • 匪需要还关注对象释放的时间

(三)使用注意

  • 霸占内存较生之对象,不要管采用autorelease,应该使用release来规范控制
  • 占内存较小的对象下autorelease,没有太要命之熏陶

(四)错误写法

  • 总是调用多次autorelease.()释放池销毁时只是会实施同样不良release)
  • Alloc之后调用了autorelease,之后还要调用了release。

(五)Autorelease注意

  • 系自带的不二法门被,如果无包含alloc new
    copy等,则这些主意返回的对象都是autorelease的,如[NSDate date];
  • 开中常会刻画一些看似措施来迅速创建一个autorelease对象,创建对象时毫不一直行使类名,而是使用self

+ (instancetype)person {

    return [[[self alloc] init] autorelease];
}

电动释放池

  • 于ios程序运行过程中,会创造无数独池塘,这些池子都是坐栈结构(先进后出)存在的。
  • 当一个目标调用autorelease时,会拿此目标放置位于栈顶的释放池中
  • 动释放池的创方式

    • ios 5.0以前的始建方式
      NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
      [pool release];//[pool drain]用于mac
    • Ios5.0以后
      @autoreleasepool
      {//开始代表创建机关释放池
      ·······
      }//结束表示销毁活动释放池

ARC内存管理机制

(一)ARC的论断则:

  • 使没有强指针指向对象,对象就是会见给保释。

(二)指针分类:

  • 强指针:默认的状下,所有的指针都是强指针,关键字__strong
  • 弱指针:_ _weak关键字修饰的指针

声明一个弱指针如下:
__weak Person *p;
ARC中,只要弱指针指向的靶子非在了,就一直把弱指针做清空操作。
weak Person p=[[Person alloc]
init];//不客观,对象同创建出来就为放飞掉,对象释放掉后,ARC把指针自动清零。
ARC中在property处不再动用retain,而是使strong,在dealloc中无需还[super
dealloc]。
@property(nonatomic,strong)Dog
dog;//
意味着生成的积极分子变量_dog是一个强指针,相当给以前的retain。
如换成是弱指针,则易成weak,不欲加以

(三)ARC的特性总结:

  • 勿允许调用release,retain,retainCount
  • 容再次写dealloc,但是非同意调用[super dealloc]
  • @property的参数:

Strong:相当给本的retain(适用于OC对象类型),成员变量是强指针
Weak:相当给本的assign,(适用于OC对象类型),成员变量是弱指针
Assign:适用于非OC对象类型(基础项目)

MRC环境get方法实现

//atomic下get方法
- (Person *)p {

    [_p retain];
    [_p autorelease];

    return _p;
}

//nonatomic下get方法
- (Person *)p {

    return _p;
}

MRC转ARC:
图片:
ACCESS 4

MRC与ARC混编

ARC工程中也得以用MRC的近乎
以targets的build phases选项下Compile
Sources下摘要无使用arc编译的文本,双击它,输入 -fno-objc-arc 即可

MRC工程被吗可以使用ARC的切近
每当targets的build phases选项下Compile
Sources下抉择而运用arc编译的公文,双击它,输入 -fobjc-arc 即可

相关文章