内存管理-黄金法则

1、内存管理-黄金法则

The basic rule to apply is everything that increases the reference counter with alloc, [mutable]copy[withZone:] or retain is in charge of  the corresponding  [auto]release.

如果对一个对象使用了alloc、[mutable]copy、retain,那么你必须使用相应的release或者autorelease。

类型定义:

  基本类型:任何C的类型,如:int、short、char、long、struct、enum、union等属于基本类型或者结构体;

  内存管理对于C语言基本类型无效;

  任何继承与NSObject类的对象都属于OC类型。所有OC对象都有一个计数器,保留着当前被引用的数量。

内存管理对象:

  OC的对象:凡是继承于NSObject;

  每一个对象都有一个retainCount计数器。表示当前的被应用的计数。如果计数为0,那么就真正的释放这个对象。

alloc、retain、release函数:

  1)alloc 函数是创建对象使用,创建完成后计数器为1;只用1次。

  2)retain是对一个对象的计数器+1;可以调用多次。

  3)release是对一个对象计数器-1;减到0对象就会从内存中释放。

增加对象计数器的三种方式:

  1)当明确使用alloc方法来分配对象;

  2)当明确使用copy[WithZone:]或者mutableCopy[WithZone:]copy对象的时;

  3)当明确使用retain消息。

上述三种方法使得计数器增加,那么就需要使用[auto]release来明确释放对象,也就是递减计数器。

………………

附加代码

………………

2、retain点语法

OC内存管理正常情况要使用大量的retain和release操作;

点语言可以减少使用retain和release的操作。

编译器对于retain展开形式:

  @property (retain)Dog *dog;

  展开为:-(void) setDog:(Dog *)aDog;

      -(Dog *)dog;

  @synthesize dog = _dog;  //(retain属性)

  展开为:-(void) setDog:(Dog *)aDog{

        if(_dog != aDog){

          [_dog release];

          _dog = [aDog retain];

        }

      };

      -(Dog *)dog{

        return _dog;

      };

copy属性:copy属性是完全把对象重新拷贝一份,计数器重新设置为1,和之前拷贝的数据完全脱离关系。

时间: 2024-10-15 17:53:55

内存管理-黄金法则的相关文章

oc内存管理黄金法则

ios笔记,如有错误,敬请告知,感谢不尽 1.When you create an object using new, alloc, or copy, the object has a retain count of 1. You are responsible for sending the object a release or autorelease message when you’re finished with it. That way, it gets cleaned up whe

Objective-C的内存管理(一)黄金法则的理解

一.内存管理黄金法则: The basic rule to apple is everything thatincreases the reference counter with alloc,[mutable]copy[WithZone:] or retainis in charge of the corresponding [auto]release. 如果一个对象使用了alloc,[mutable] copy,retain,那么你必须使用相应的release或autonrelease 二.

ARC内存管理中容易忽略的问题

目录: 一.字符串(String) 1.1.字符串的创建 1.2.字符串的isa 二.拷贝(copy) 2.1.immutable对象的copy 2.2.mutable对象的copy 2.3.浅拷贝与深拷贝 2.4 .单层深拷贝 三. 集合(Collections) 3.1.NSMapTable 3.2.NSHashTable 3.3.NSPointerArray 一.字符串(String) 看到好几篇文章都在说这道面试题,字符串差不多是每个高级语言必有的,在实际项目中也的确是使用的最多类型之一

关于内存管理的黄金法则

最近对内存管理,有了一些新的认识,以前只知道alloc,或者retain,或者copy,之后需要release或者autorelease; 只知其一,但是在工作学习中仅仅知道这些是不够用的,还需要知道属性等内部的内存存管理才行. @property (readwrite,nonatomic,assign)NSInteger age; @property (readwrite,nonatomic,copy)NSString * name; @property (readwrite,nonatomi

OC_内存管理:MRC与ARC

内存管理 1.1内存管理 1.1.1 C的内存管理,以及麻烦之处 char *p = (char *)malloc(100*sizeof (char)); 这是C的动态内存分配,我们手动跟系统申请了100个字节的内存:或者说系统在堆里开辟了100个字节的空间,并将这个空间的首地址返回给指针变量p. free(p); 使用完成后,手动跟系统释放内存空间:或者说系统回收空间. 如上就是C里简单的内存管理. C的内存管理,我们手动申请,手动释放.这样来看,我们只需要注意三个问题就好了: 1,申请内存,

SET方法内存管理

SET方法内存管理 情况一:Person类中有一个属性car -(void) setCar:(Car *) car{ _car = car;   // line 1 } 这样做是不妥的,主方法中调用一下说明这个不妥: Person * p = [[Person alloc]init]; Car * c = [[Car alloc]init]; p.car = c;  // 调用上面set方法中的line 1 ,因无alloc copy new ,故 虽然 _car 使用并指向了 Car对象,但对

iOS开发-内存管理

内存管理 对于这篇呢,其实现在都是ARC模式,正常状态下基本不用我们去手动释放内存,所以如果不是要面试呀.装逼或者扎实功底的,就先别看了或者了解下即可,因为像面试时,有些面试官想看你的基础时,就有些人会问,现在工作基本不会用到. 学习目标 1. 掌握内存管理的原理 2. 掌握手动内存管理 =============================================== 1.需要理解的知识 1.1内存管理 1.1.1 C的内存管理,以及麻烦之处 char *p = (char *)m

iOS之“内存管理”篇

什么是内存管理? 内存管理的是堆空间,内存管理的任务:保证开辟的空间能够被正确释放. 内存管理存在的问题?? [内存泄露]开辟的空间未释放. [提前释放]堆空间没有使用完毕,就已经释放了. [重复释放]开辟同一个空间,被释放多次. [注]内存泄露和提前释放短时间内不会造成系统崩溃,但是重复释放直接造成系统崩溃. C语言中内存管理的困境? 必须清楚一块堆空间,到底有几个指针指向,在通过其中一个指针free该空间时,必须保证所有的指针必须使用完毕了,避免[提前释放].而且必须保证只能这些指针中的一个

OC学习总结4 内存管理

内存管理 基本数据类型(int,float,double,char,struct,enum)的数据内存不需要内存管理 1 对象的内存管理 诞生 alloc或new或copy 生存 接收消息和执行操作 交友 借助方法的组合和参数,调用方法 销毁 内存被释放 delloc:相当于被释放内存的临终遗言,每个内存被销毁之前都会调用dealloc方法 2 引用计数 1 Cocoa采用引用计数也叫作保留计数 2 alloc new copy 用这三个方法创建对象时,对象的引用计数器为1 3 retain 给