Object-C 学习笔记(十)---内存管理MRC

原创 2013年12月04日 11:23:07

内存管理


MRC——手动管理内存

ARC——自动管理内存


MRC

OC采用“引用计数”(retainCount)方式管理对象占用的内存

1.      使用alloc为对象分配内存;使用dealloc释放对象所占用的内存。

2.      使用alloc、new或者copy构造对象是,对象的retainCount为1.

3.      调用对象的retain方法可以增加1 retainCount

4.      调用对象的release方法可以减少1 retainCount

5.      当对象的retainCount为0时,dealloc会自动调用,释放对象内存;否则分配的内存讲被一直占用。

6.      所有对象可以使用retainCount属性查看当前的计数器值。

 

 

例子:

NSString *dadyCar = [[NSStringalloc]initWithFormat:@”Car”];// dadyCar拥有对象所有权retainCount+1

NSString *mumCar = [dadyCar retain];// mumCar拥有对象所有权,retainCount+1

 

NSString *sonCar = [mumCar retain];// sonCar拥有对象所有权,retainCount+1

 

NSString * friendCar = sonCar;// friendCar不拥有对象的所有权,只是简单指向对象内存空间,retainCount不会发生变化

 

[dadyCar release];// retainCount-1

[mumCar release];// retainCount-1

[sonCar release];// retainCount-1

注意:

         如果所有拥有对象的引用都释放了对象的所有权(retainCount=0),那么friendCar就变成了“野指针”,因为对象已经不存在,不能再调用对象的资源。



@property(retain,nonatomic)Strdent

一个类中,如果这个类有属性声明retain或者copy的属性,那么我们需要再这个类的dealloc方法里面释放这个属性。

 

dealloc方法在对象引用计数为0是自动调用。

主要用于适当自身所占用的资源。永远不要手动调用dealloc,应由系统自动调用。

 

真正释放对象内存空间的方位为:dealloc

当一个对象引用计数变成1时,再调用release的时候,其release就会自动调用系统的dealloc方法去释放对象所占的空间。

 

一般在类中需要overwrite覆盖/重写/复写dealloc方法,进行属性控制。

-(void)dealloc//相当于C++的析构方法

{

         //释放子类的引用

         [super dealloc];//调用父类的dealloc,释放父类

}

 

内存释放原则一:

       对象分配内存,并应在使用后,调用release释放内存。

凡是出现retain alloc copy的地方,都应该出现release与之匹配调用。

 

内存释放原则二:

         内存无法确定释放时间是,可以使用autorelease向最近池注册。

         有池决定释放时间

         使用便利构造器获得的对象,都应该是autorelease的。

 

Autorelease://自动释放

——延时释放对象内存。

对于每一个Runloop, 系统会隐式创建一个Autoreleasepool,这样所有的release pool会构成一个象CallStack一样的一个栈式结构,在每一个Runloop结束时,当前栈顶的Autorelease pool会被销毁,这样这个pool里的每个Object会被release。

例子:除了大括号之后,会自动release

 

(1)     当创建的对象未来某个时候销毁是,可以使用对象的autorelease。

(2)     对象讲所有管理权交给最近的NSautoreleasePool对象,并由其全权释放。

 

Autoreleasepool://自动释放池

         对象使用autorelease释放的会放进Autoreleasepool,系统自动释放。


例子:

//
//  People.h
//  Memory
//
//  Created by 5016 on 13-12-4.
//  Copyright (c) 2013年 dradon. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface People : NSObject

//成员属性
@property(retain,nonatomic)NSString* name;
@property(assign,nonatomic)NSInteger age;

-(People *)initWithName:(NSString*) name andAge:(NSInteger) age;

+(People *)PeopleWithName:(NSString*) name andAge:(NSInteger) age;

-(void)toString;


@end

//
//  People.m
//  Memory
//
//  Created by 5016 on 13-12-4.
//  Copyright (c) 2013年 dradon. All rights reserved.
//

#import "People.h"

@implementation People

@synthesize name=_name,age=_age;

-(People *)initWithName:(NSString*) name andAge:(NSInteger) age
{
    if(self = [super init])
    {
        _name = name;
        _age = age;
    }
    return self;
}

//便利构造器
+(People *)PeopleWithName:(NSString*) name andAge:(NSInteger) age
{
    People *person = [[People alloc] initWithName:name andAge:age];
    
    return [person autorelease];//向自动释放池注册
}


-(void)toString
{
    NSLog(@"我的名字是%@,今年%ld岁.",_name,_age);
}

//重写(overwirte)父类方法
-(void)dealloc//用来释放对象的方法,相当于C++里面的析构方法
{
    NSLog(@"这个对象被完全释放");
    self.name = nil;//等价于[_name release]或者[self.name release];
    [super dealloc];
}

@end

//
//  main.m
//  Memory
//
//  Created by 5016 on 13-12-4.
//  Copyright (c) 2013年 dradon. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "People.h"

int main(int argc, const char * argv[])
{
     NSLog(@"|-----------使用alloc开辟对象堆内存空间按-----------------|");
    People *person1 = [[People alloc]initWithName:@"DRAGON" andAge:23];//alloc开辟对象 +1
    [person1 toString];
    NSLog(@"person1的引用计数是:%ld",[person1 retainCount]);
    [person1 retain];//+1 = 2
    NSLog(@"person1的引用计数是:%ld",[person1 retainCount]);
    [person1 release];//-1 = 1 ;这里对象已经释放一次,引用计数为1
     NSLog(@"person1的引用计数是:%ld",[person1 retainCount]);
    [person1 release];//-1 = 0 ;这里对象再释放一次,引用计数为1-1,系统自动调用dealloc
    NSLog(@"person1的引用计数是:%ld",[person1 retainCount]);
    //[person1 release];//再调用一次,则是过度释放,会出现异常
    
    NSLog(@"|-----------使用便利构造器-----------------|");
    @autoreleasepool {//使用自动释放池进行释放,因为程序结束后会释放
        People *person = [People PeopleWithName:@"dragon" andAge:20];
        [person toString];//使用便利构造器 不需要使用release
    }

    return 0;
}

运行结果:



相信到了这里大家会基本理解内存管理.


Object-C学习笔记十-----内存管理

内存管理时程序设计中常见的资源管理的一部分。但是由于每个使用的资源都是有限的,所以如何更好的使用好这些资源就是问题所在。 1。对象的生命周期,每个对象都有生命周期, 2。引用计数,Cocoa采用的...
  • lutaotony
  • lutaotony
  • 2011年09月17日 17:10
  • 839

object-c内存管理(一) MRC

一 . 对内存的理解         内存是于cpu交互的桥梁,计算机所有的程序都在内存中进行。所以控制内存在编程中显得尤为重要,好的内存管理会使得程序运行效率更高,占用内存最小。   相反管理不好则...
  • u013412220
  • u013412220
  • 2016年01月23日 01:05
  • 308

内存管理的两种方式——ARC和MRC

Objective-c中编程开发中,提供了两种内存管理机制: 1、手动管理内存,即MRC(MannulReference Counting); 2、自动管理内存,即ARC(Automatic Re...
  • potato512
  • potato512
  • 2016年05月19日 17:25
  • 1104

MRC内存管理(四)set、get方法

续上一篇MRC内存管理(三) 在People文件中 //对于对象的描述,需要用retain @property (retain,nonatomic)NSArray *array; ...
  • MinggeQingchun
  • MinggeQingchun
  • 2016年06月25日 18:15
  • 651

iOS MRC手动内存管理 心得体会

iOS MRC手动内存管理 以下是自己调试出的经验 首先注意一点: 修改代码后clean工程是必须的,但还不够,还必须卸载手机上的app,否则会导致多次调用结果和预期不一致,本人就遇到了这怪事,调...
  • chengkaizone
  • chengkaizone
  • 2015年11月28日 13:26
  • 934

《Object-C高级编程 iOS与OS X多线程和内存管理》读书笔记之一

第1章 自动引用计数 1.自动引用计数(ARC,Automatic Reference Coounting)是指内存管理中对引用采取自动计数的技术。 2.满足以下条件,就无需手工输入retain ...
  • xjh093
  • xjh093
  • 2016年12月09日 22:22
  • 448

内存管理MRR/ARC,property和内存泄露

转载自:http://sofire.iteye.com/blog/1705149 内存管理MRR/ARC,property和内存泄露 博客分类:  iOS/Obj-C   ...
  • ysysbaobei
  • ysysbaobei
  • 2013年12月10日 14:40
  • 2911

内存管理机制MRR/MRC和ARC

内存管理规则 当你使用new、alloc、copy方法创建一个对象时,该对象的引用计数器值为1.当不再使用该对象时,你要负责向该对象发送release或者autorelease消息。 使用其他方法获取...
  • u012437355
  • u012437355
  • 2016年08月01日 16:52
  • 411

Objective-c的内存管理MRC与ARC

使用vim进行编辑的时候,如果我们打开了两个不同的vim,此时不能用yy和p在两个Vim窗口之间进行复制和粘贴,此时,需要分割窗口,然后就可以复制粘贴了。步骤如下:  假如我们有两个需要编辑的...
  • huang2009303513
  • huang2009303513
  • 2014年03月07日 17:18
  • 2226

Object c的set和get方法,ARC和MRC 下面的实现

ARC 下面的实现: 首先是创建一个person的类, 然后声明set方法和get方法 有规则是,set方法的名字后面就是变量的,setName get方法直接就用变量名去掉下划线 // // Pe...
  • Rodulf
  • Rodulf
  • 2016年09月12日 00:04
  • 1661
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Object-C 学习笔记(十)---内存管理MRC
举报原因:
原因补充:

(最多只允许输入30个字)