OC内存管理小记

MRC手动 管理   ARC自动 管理内存 Automatic Reference(引用) Counting
Manual Reference(引用) Counting


oc采用"引用计数"(retain count)方式管理对象所占的内存
1.使用alloc为对象分配内存 //使 用dealloc释放对象所占用的内存
2.使用 alloc new 或者 copy 构造对象时,对象的retain count为1
3.调用对象的 retain 方法可以 增加 1 retain count
4调用对象的 release 方法可以 减少 1 retain count
5当对象的 retaincount为0 时候, .dealloc会自动调用,释放对象内存 ,否则 分配给对象的内存将一直被占用
6.所有对象可以使用 retaincount 属性查看当前计数器值

会影响计数器的操作
:

1.alloc创建一个对象没并将其引用计数设为1.并拥有对象的所有权
2.copy制造副本 并将副本的 引用计数设为1.并拥有副本的所有权
3, retain 使对象 引用计数加1 .并拥有对象的所有权
4. release 使对象 引用计数减1 .并放弃对象的所有权
5.autorelease 向autoreleasepool注册(>>?)
autorelease,该方法是将该对象内存的管理放到autoreleasepool中

属性声明中内存管理原则
@property(retain,nonatomic)
一个类中 如果 这个类有属性声明retain或者copy的属性 那么我们需要在这个类的 dealloc方法 里面去释放这个属性
@property(retain,nonatomic)Student*stu


dealloc方法(系统的方法)
dealloc方法在对象引用计数为0实 自动 调用
主要用于释 放自身所占用的资源 . 永远不要手动调用dealloc 应有系统自动调用
.m实现
-(void)dealloc
{

self.name=nil;//推荐这种.
//[_name release]//有野指针的情况发生
[super dealloc]
}
这是一个系统方法,系统会自动调用, 当一个对象的引用计数为1的时候 ,再调用release方法的时候,就会自动调用该方法,来释放对象)


内存释放原则一:
对象分配内存,并应在使用后,调用release释放内存
凡是出现retain alloc copy的地方 都要有release与之匹配


自动释放
autorelease pool
延迟释放(延迟到出了池才释放.而且池是最近的池(大括号))
一个大括号就是一个池


NSAutoreleasepool
自动释放池
当创建的对象未来某个时候销毁时 可以使用对象的autorelease
对象将所有权管理交给最近的NSAutoreleasePool对象,并由其全权管理
当池对象drain或release时 会逐一对池内对象发送release消息
+号方法一般使用
多用于有返回值的时候.
其他不建议使用

内存管理原则二:
内存无法确定释放时间时 可以使用autorelease像最近的池注册
由池决定释放所有权的时间
使用便利构造器获得的对象 都应是autorelease的
一定不要释放没有所有权的对象
assign.还有等号直接赋值的.

 @autoreleasepool {                //一个对象刚刚被创造出来引用计数为1        Student*stu1=[[Student alloc]initWithName:@"zhangsan" andAge:22];                NSLog(@"stu1的引用计数为%ld",[stu1 retainCount]);        

[stu1 retain];//retain引用计数加一相当于多了一条命       

NSLog(@"stu1的引用计数为%ld",[stu1 retainCount]);     

[stu1 release];//release引用减一相当于杀死一次      

 NSLog(@"stu1的引用计数为%ld",[stu1 retainCount]);                

[stu1 release];//不可能为0.(再写一次的话就是过度释放)       

 NSLog(@"stu1的引用计数为%ld",[stu1 retainCount]);                   }


代码在硬盘中

堆 :alloc出来的对象//需要做内存管理,手动开辟手动回收
{
      堆区(由程序员分配释放(动态分配内存的)): alloc 的内容(对象),实例变量(属于对象的一个部分所以跟对象一样放在堆区),动态属性     OC 特别 [NSString alloc]initWithFormat] 是创建格式化字符串在堆区
         (与数据结构中的堆不同。但分配方式类似与链表
}

栈:局部变量.//不需要我们做内存管理.系统分配系统回收
{
栈区(由编译器自动分配释放):指针(对象的地址),局部变量,方法本身,静态属性
}

代码区: 类,方法(在被调用的时候才会占内存)
         (存放函数体的二进制代码)


常量区 存放常量和字符串       
  OC 特别 [[NSString alloc]initWithString] 是创建字符串存在于常量区




静态区 分为初始化区和未被初始化区):存放全局变量和静态变量
         已被初始化的存放在初始化区,未被初始化的存放在未被初始化区


OC 中只需要管理堆里面的东西
程序的内存分配,分为:静态区,常量区,栈,堆,代码区

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值