iOS中内存初级管理

原创 2015年07月07日 19:53:45

   

   1:内存的管理方式

     在ios中可能会遇见(MRC)和(ARC)的两种管理方式.

     MRC:使用的人群可能是一些老程序员,应为他们觉得比arc更安全好用.(⼈人⼯工引⽤用计数)

 ARC:是基于MRC的一种管理方式(⾃自动引⽤用计数)


OC采⽤用引⽤用计数机制管理内存,当⼀一个新的引⽤用指向对象时,引⽤用计数器就递增,当去掉⼀一个引⽤用时,引⽤用计数就递减当引⽤用计数到零时,该对象就将释放占有的资源


   2:影响内存计数的方法

       下面以一个person类为演示基础

 2.1 +alloc  (引用计数加1)

 开辟内存空间,让被开辟的内存空间的引⽤用计数变为1。这是由01的过程

代码实现:

Person *p = [[Person alloc] init];
    
    NSLog(@"%ld",[p retainCount]);
这是的输出结果为:1

2.2 -retain (引用计数加1)
如果内存空间之前引用计数为1,retain变为2

代码如下

 Person *p = [[Person alloc] init];
    
    Person *p2 = [p retain];
    NSLog(@"%ld",[p retainCount]);

输出结果为:2

2.3 -copy 把某一内存区域的内容拷贝一份,拷贝到新的内存空间中,被拷贝的区域的引用计数不变,新内存区域的引用计数为1

Person *p = [[Person alloc] init];
    
    Person *p2 = [p retain];
    
    Person *p3 = [p2 copy];
    
    NSLog(@"%ld",[p retainCount]);

此时的输出结果为:2

2.4 -release (引用计数减1)   如果之前的引用计数为1,release之后变为0,内存会被系统回收.

Person *p = [[Person alloc] init];
    
    Person *p2 = [p retain];
    
    Person *p3 = [p2 copy];
    
    [p release];
    
    NSLog(@"%ld",[p retainCount]);

输出结果为:1

 2.5 -dealloc 当引用计数为0的时候,由对象自动调用

调试方法

2.5.1 首先在对应类的.m文件中写上

-(void)dealloc
{
    NSLog(@"引用计数为0,系统自动调用");
    [super dealloc];
}

然后在main.m中调用

Person *p = [[Person alloc] init];
    
    Person *p2 = [p retain];
    
    Person *p3 = [p2 copy];
    
    [p release];
    [p release];
    
    NSLog(@"%ld",[p retainCount]);

应为在第一次使用 p release是p的应用计数为2,所有用两次release才能吧引用计数调成0,才能出现效果


2.6 -autorelease,未来的某一时刻引用计数减1


在autorelease中所有的引用都是在栈区存放,所以在调用的时候返回的结果是,先进后出,后进先出



3:内存管理原则

引用计数和增加相等,当引用计数为0的时候,该快内存则不再被使用.

在一块代码内,增加和减少的次数要相等.


  4:Copy的实现

  在实现copy的时候有两种过程,一个是深拷贝和浅拷贝

4.1浅拷贝

  如果指针*p指向了A内存的a地址,*p2也指向了A内存中的a地址,两个指向同一个地址,如果*p指向的内容改变,则*p2也改变.

©代码如下:在实现copy动作的时候用实现协议<nscopying>

©在对应类的.m文件中实现该方法

- (id)copyWithZone:(NSZone *)zone
{
    //浅拷贝
    return [self retain];

}

4.2深拷贝   在原有的基础上把对用的区域拷贝到另外一块内存中

实现代码如下 先实现协议<nscopying>

在对应.m文件中实现如下方法,(比较单一的)

- (id)copyWithZone:(NSZone *)zone
{
  
    //深拷贝
    //申请空间,创建一个对象
    Person *p = [Person allocWithZone:zone];
    //进行赋值
    p.name = self.name;
    p.age = self.age;
    p.sex = self.sex;
    //3返回刚刚生成的对象
    
    return  p;
    
    
}
在main.m中调用如下

  //深拷贝
    Teacher *teacs = [[Teacher alloc] init];
    
    
    teacs.name = @"gggggggggggggg";
    
    Teacher *t2 = [teacs copy];
    
    teacs.name = @"dddddd";
    NSLog(@"-------=%@",t2.name);
    
    NSLog(@"-------=%ld",[t2 retainCount]);
运行结果如下


综上可见,程序在执行深度拷贝的时候,不会改变copy后对象的数值.


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

iOS开发语言之OC 初级内存管理

出现内存问题一般有两个方面: 1.内存溢出:超出了给你限定的内存区域导致的问题(就跟用容器装水一样,超出了容器的水就会溢出) 2.野指针访问:对象的内存空间已经被系统回收,仍然使用指针操作这块内存...

OC内存管理初级

一、内存管理的方式 ***整个iOS内存管理的核心是:引用计数。      1、C语言的内存管理,管理内存的开辟(malloc)和回收(free)      2、但是OC和C语言不一样,不直接管理内...

C语言内存管理(初级)----链表

上一篇文章里实现了二维动态数组的创建和销毁,现在来看一个稍加复杂一点的实例:链表,读者需具有链表的基本知识,本文的链表实现与读者所熟知的实现有一些差异。     假定我们要写一个计算器程序,它接受一...

9、内存管理初级

内存管理的⽅式内存溢出iOS给每个应⽤程序提供了⼀定的内存,⽤于程序的运⾏。 iPhone 3GS内存30M左右, iPhone 5S 内存80M左右。 ⼀旦超出内存上限,程序就会Crash。 ...

OC内存管理初级演练

@autoreleasepool { //alloc 开辟内存空间,并且将对象的引用计数由0变1. Person *per1 = [[Person alloc] ini...

[Object C]_[初级]_[Object C之内存管理]

在项目中,经常会程序崩溃,内存增大等问题,影响程序的性能,出现这个问题的原因就是内存泄露,创建的对象没有释放,或者是对象被多次释放。所以内存管理对于整个项目来说是非常重要的。

内存管理初级

***自己每开辟一次空间,自己要对其(自己开辟的)进行释放;对引用计数+1,相应的也要对引用计数-1;不必管系统对空间的操作,系统会对其进行处理. 1.能让引用计数改变的五个方法 (1)+allo...

oc的内存管理初级

OC中内存管理的机制在对象被销毁时自动调用dealloc

内存管理初级

一.内存分为五大区 :栈区,堆区,全局区,常量区,代码区 2.栈区特点:    系统分配,系统回收  存储在栈区的数据为临时变量,即定义在方法体中的变量,包括形参. 栈区的特点是 先进后...

Swift-析构方法与内存管理(初级)

Swift析构方法与内存管理(初级) /* Swift 内存管理(只有ARC模式,没有MRC模式,不需要手动管理内存,系统自动管理) */ import Foundation /* ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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