oc内存管理

1.MRC

使用引用计数方式手动管理内存
release 引用计数减1
retain 引用计数加1
###手动内存管理黄金法则

谁调用new,alloc,retain,copy,multableCopy,谁就要调用对应的release或autorelease;

口诀:有加就有减

当你需要一个对象的时候,那么就给他发送一条retain的消息
当你不需要一个对象的时候,那么就给他发送一条release的消息

MRC中@property的使用

看例子

#import <Foundation/Foundation.h>
#import "CZRoom.h"
/*
  手动内存管理的关键字
  retain  就再setter 和 getter方法中加入一些内存管理的代码
  当属性是一个普通OC对象的时候,使用retain
  assign  直接赋值,不生成内存管理代码 
  当属性是一个基本数据类型的时候,使用assign
  copy  复制对象,NSString 使用copy

 线程安全
 nonatomic:非原子,不会生成线程安全的代码,速度快,iOS通常都是这种
 atomic:原子(默认),会生成线程安全的代码,速度慢

 控制权限
 readwrite:可读可写,生成getter 与 setter方法是声明与实现
 readonly:只读 只生成getter方法

 修改方法名称
 getter 修改生成的getter方法的名称
        一般情况下,BOOL类型的属性的getter方法是以is开头的
 setter 修改生成的setter方法的名称
        一般不去修改它

 */
@interface CZPerson : NSObject

@property (nonatomic,assign,getter=isMan) BOOL man;

@property (nonatomic,copy) NSString *name;

@property (nonatomic,assign,readonly) int age;

@property (nonatomic,retain) CZRoom  * room;

循环引用

多个对象之间相互引用,形成环状。
解决方案:mrc的情况下将其中一方改成assign,不使用内存管理

2.自动释放池

O-C当中的内存释放,并不是像java/.net那样有一个自动的释放池,开发人员不用去关心有关内存释放的问题,O-C里面的自动释放池比c语言的手动内存管理要好一些,但是相对于java/.net来说又弱一些,所以说O-C当中的释放属于半自动的释放池。

什么是自动释放池

  1、Autorelease pool
  自动释放池(Autorelease pool)是OC的一种内存自动回收机制,可以将一些临时变量通过自动释放池来回收统一释放
2、autorelease
  自动释放池本事销毁的时候,池子里面所有的对象都会做一次release操作
###自动释放池的原理:
1、系统中存在一个自动释放池栈, 当遇到 @autoreleasepool { 把这个自动释放池压入栈中
2、但遇到与之对应 } 自动释放池,出栈,它出栈的时候,会对池中所有对象进行一次release操作
3、自动释放池栈中,只有栈顶自动释放池是活动的,其他的都在休眠
4、当你调用autorelease的时候,它会把这个对象放在栈顶的自动释放池中
 黄金法则:如果对一个对象使用了alloc,[mutable]copy,retain,那么必须使用相应的release或者autorelease.
参考文章:http://www.tuicool.com/articles/uiQfYf

autorelease:延长对象生命周期
把对象放到离自己最近那个自动释放池中
当自动释放池销毁的时候,它会把放在其中所有对象进行一次release的操作
它和对象在哪里创建没有关系

3.ARC

ARC automatic Reference Counting 自动引用计数

ARC 编译器特性
编译器会在适当时候,加入内存管理的代码

强指针:默认所有的指针都是强指针
只要是有强指针指向一个对象,那么这个对象就不会被释放
只要是没有强指针指向一个对象,那么这个对象就被立即回收
__strong 强指针标示,但是默认所有指针都是强指针,所以他没有用
弱指针:弱指针指向的对象不影响对象回收
注意:不要用弱指针指向一个刚刚创建出来的对象,否则刚刚建立就被回收

当出现循环引用的时候,必须要由一端是弱指针,否则互相引用无法释放内存,出错

弱指针的自动nil化
弱指针会在其指向的实例对象被释放后自动变成nil;
即当弱指针指向的实例对象被释放了,弱指针也不会变成野指针

类似c++的智能指针,arc还是要更好用一些的,缺点是只能管理oc alloc出来的内存,不能管理c语言的malloc出来的内存

ARC中@property的使用

见例子


#import <Foundation/Foundation.h>
#import "CZDog.h"
/*
 内存管理
    strong   对于普通对象
    copy     字符串
   assign    基本数据类型
   weak      循环引用一端必须使用weak


 */

@interface CZPerson : NSObject


//年龄
@property (nonatomic,assign) int age;
//姓名
@property (nonatomic,copy) NSString * name;
//狗
@property (nonatomic,strong) CZDog * dog;


@end

自动释放池,同mrc

关于arc的参考文章

ARC指南1 - strong和weak指针
ARC指南2 - ARC的开启和禁止

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值