对象的保留和所有权的释放:

int main(int agrs,char *argv[])
{
  @autoreleasepool{
     Person *person = [[Person alloc]initWithName:@“Tom"];    //retainCount=1
     [person setName: name];  //retainCount = 2;
     [person release];
     }
}
@interface Person
@property(nonatomic,retain)(NSString*)name;
@end
 
详解:在主函数main中创建了一个perosn对象,此时,main函数拥有对象person的所有权,保留计数器retainCount=1;紧接着,因为类Person的实例变量name类型retain是强引用,因此,main函数中person对象调用setName方法时,类Person也拥有了person对象的所有权,所以,Person类就将保留计数器加1用来保留住person对象,此时的retainCount=2;根据对象谁创建,谁释放的原则,main函数中main函数拥有的perosn对象被main函数使用完后就释放其所有权,随即被main函数release掉了。此时,保留计数器retainCount=1,此时系统不会调用dealloc方法来销毁对象,对象被保留给了类Person。等到最后,类Person用完了对象person后,类Person也应该释放person对象的所有权,因此,就调用重写的dealloc方法,在这个方法内release掉person所有权,retainCount=0,在完成父类的【super dealloc】后,这个perosn对象就彻底的被销毁了。
 
总之两句话:(1)谁在调用这个对象,就必须获得其所有权,将对象保留住,防止直接被销毁了;
          (2)谁创建的对象,谁负责释放;谁调用的对象,谁负责释放。
 
 
这些规则如下所示:
<a>、当你使用new、alloc或copy方法创建一个对象时,该对象的保留计数器值为1。当不再使用该对象时,你要负责向该对象发送一条release或autorelease消息。这样,该对象在其使用寿命结束时被销毁。
 
<b>、当你通过任何其他方法获得一个对象时,则假设该对象的保留计数器值为1,而且已经被设置为自动释放,你不需要执行任何操作来确保该对象被清理。如果你打算在一段时间内拥有该对象,则需要保留它并确保在操作完成时释放它。
 
<c>、如果你保留了某个对象,你需要(最终)释放或自动释放该对象。必须保持retain方法和release方法的使用次数相等。
 
大道至简:如果我使用了new、alloc或copy方法获得一个对象,则我必须释放或自动释放该对象。如果通过其他任何方法获得的对象,你不需要再去关心如何销毁该对象。因为他们一般都被设置为自动释放。例如:NSMutableArray *array = [NSMutableArray arraywithCapacity:17] 、NSColor *color = [NSColor blueColor]等等。

Objective-C:保留计数器思想的详解(对象的保留和所有权的释放)的更多相关文章

  1. java基础:详解类和对象,类和对象的应用,封装思想,构造方法详解,附练习案列

    1. 类和对象 面向对象和面向过程的思想对比 : 面向过程 :是一种以过程为中心的编程思想,实现功能的每一步,都是自己实现的 面向对象 :是一种以对象为中心的编程思想,通过指挥对象实现具体的功能 1. ...

  2. hibernate学习(3)——api详解对象(2)

    1.   Transaction 事务 事务的操作: 开启事务 beginTransaction() 获得事务 getTransaction() 提交事务:commit() 回滚事务:rollback ...

  3. hibernate学习(2)——api详解对象

    1   Configuration 配置对象 /详解Configuration对象 public class Configuration_test { @Test //Configuration 用户 ...

  4. C++中double类型的数字如何保留三位小数点详解

    我们知道C语言中,如果要求输出结果保留三位小数,我们可以使用pritf()函数轻松的解决.但是C++的输出运算符<<并没有直接实现这个功能,怎么办呢?之前在找答案的过程中各路大神给出了千姿 ...

  5. JS 详解对象的继承

    在学习这篇博文前,请先移步我的另外一篇博文:JS 一张图理解prototype.proto和constructor的关系,先弄清楚“原型链”,这样对于理解继承会非常有效. 注意:博文中提到的“属性”, ...

  6. [C#] 类型学习笔记二:详解对象之间的比较

    继上一篇对象类型后,这里我们一起探讨相等的判定. 相等判断有关的4个方法 CLR中,和相等有关系的方法有这么4种: (1) 最常见的 == 运算符 (2) Object的静态方法ReferenceEq ...

  7. .NET Core 对象( Transient、Scope、Singleton )生命周期详解 (对象创建以及释放)

    首先我们在VS2019中创建一个.NET Core的控制台程序,方便演示: 需要安装两个依赖包 Microsoft.Extensions.DependencyInjection 依赖注入对象的具体实现 ...

  8. linux下gzip的压缩/解压缩详解

    linux下gzip的压缩详解 Linux压缩保留源文件的方法: gzip –c filename > filename.gz Linux解压缩保留源文件的方法: gunzip –c filen ...

  9. printf命令详解

    基础命令学习目录首页 本文是Linux Shell系列教程的第(八)篇,更多shell教程请看:Linux Shell系列教程 在上一篇:Linux Shell系列教程之(七)Shell输出这篇文章中 ...

随机推荐

  1. Ionic Js四:复选框

    ionic 复选框(checkbox)与普通的 HTML 复选框没什么区别,以下实例演示了 ionic 复选框 ion-checkbox 的应用. <ion-checkbox ng-model= ...

  2. 牛客网 桂林电子科技大学第三届ACM程序设计竞赛 D.寻找-树上LCA(树上a到b的路径上离c最近的点)

    链接:https://ac.nowcoder.com/acm/contest/558/D来源:牛客网 寻找 小猫在研究树. 小猫在研究树上的距离. 给定一棵N个点的树,每条边边权为1. Q次询问,每次 ...

  3. 理解 Python 中的元类

    本文编程环境:Jupyter NoteBook python3 类也是对象 在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段.在 Python 中这一点仍然成立: class Objec ...

  4. 导出Excel超过65535条限制解决方案

    使用poi导出excel的时候如果数据过多,超过65535条会报错,因为excel2003一个sheet表最多导出65535条,excel2007是10万4000多条限制. 因此遇到这种excel导出 ...

  5. 【二分答案】Google Code Jam Round 1A 2018

    题意:有R个机器人,去买B件商品,有C个收银员,每个收银员有能处理的商品数量上限mi,处理单件商品所需的时间si,以及最后的装袋时间pi. 每个收银员最多只能对应一个机器人,每个机器人也最多只能对应一 ...

  6. Linux下rz,sz与ssh的配合使用,实现文件传输

    一般来说,linux服务器大多是通过ssh客户端来进行远程的登陆和管理的,使用ssh登陆linux主机以后,如何能够快速的和本地机器进行文件的交互呢,也就是上传和下载文件到服务器和本地:    与ss ...

  7. bzoj 3283 扩展BSGS + 快速阶乘

    T2  扩展BSGS T3 快速阶乘 给定整数n,质数p和正整数c,求整数s和b,满足n! / pb = s mod pc 考虑每次取出floor(n/p)个p因子,然后将问题转化为子问题. /*** ...

  8. CDOJ 42/BZOJ 2753 滑雪与时间胶囊 kruskal

    2753: [SCOI2012]滑雪与时间胶囊 Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 1376  Solved: 487[Submit][St ...

  9. PIVOT函数与UNPIVOT函数的运用

    PIVOT用于将行转为列,完整语法如下: TABLE_SOURCE PIVOT( 聚合函数(value_column) FOR pivot_column IN(<column_list>) ...

  10. Linux给目录创建软链接的技巧

    ln -s /home/fei/workspace /var/www 注意:源目录和目标目录都必须是绝对路径