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

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

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)谁创建的对象,谁负责释放;谁调用的对象,谁负责释放。

时间: 2024-10-13 01:56:33

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

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

1   Configuration 配置对象 /详解Configuration对象 public class Configuration_test { @Test //Configuration 用户加载配置文件 public void fun1(){ //1.1 调用configure() 方法=> 加载src下名为hibernate.cfg.xml Configuration conf = new Configuration().configure(); //1.2 如果配置文件不符合默认加

Scala详解---------对象

Scala中的对象 摘要: 在本篇中,你将会学到何时使用Scala的object语法结构.在你需要某个类的单个实例时,或者想为其他值或函数找一个可以挂靠的地方时,你就会用到它.本篇的要点包括: 1. 用对象作为单例或存放工具方法 2. 类可以拥有-个同名的伴生对象 3. 对象可以扩展类或特质 4. 对象的apply方法通常用来构造伴生类的新实例 5. 如果不想显式定义main方法,可以用扩展App特质的对象 6. 你可以通过扩展Enumeration对象来实现枚举 单例对象 Scala没有静态方

(三)详解对象-关系映射文件

一.Hibernate中持久化类编写规范 -必须提供无参数的默认构造方法.因为程序运行时,Hibernate会运用java的反射机制,创建实体类的实例. -所有属性必须提供public访问控制符的set get方法 -属性应尽量使用基本数据类型的包装类型(如Integer) 基本数据类型无法表达null值,所有基本数据类型的默认值都不是null,这样就有很大的缺陷. 例如有一个score属性,表示学生分数,如果为0,那么是表示该学生未参加考试还是说该学生成绩为0呢? 这时候如果用包装类型,就可以

JAVAWEB开发之Hibernate详解(一)——Hibernate的框架概述、开发流程、CURD操作和核心配置与API以及Hibernate日志的使用

Hibernate框架概述 什么是Hibernate? 框架:软件的半成品,完成部分代码的功能. Hibernate:Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思想来操作数据库.Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序中使用,也可以在Servlet/JSP的web应用程序中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成

Linux Shell系列教程之(八)Shell printf命令详解

本文是Linux Shell系列教程的第(八)篇,更多shell教程请看:Linux Shell系列教程 在上一篇:Linux Shell系列教程之(七)Shell输出这篇文章中,已经对Shell printf命令有了一个简略的介绍,本篇给大家详细介绍下Shell中的printf命令. 一.Shell printf命令语法 printf format-string [arguments...] format-string为描述格式规格的字符串,用来描述输出的排列方式,最好为此字符串加上引号.此字

printf命令详解

基础命令学习目录首页 本文是Linux Shell系列教程的第(八)篇,更多shell教程请看:Linux Shell系列教程 在上一篇:Linux Shell系列教程之(七)Shell输出这篇文章中,已经对Shell printf命令有了一个简略的介绍,本篇给大家详细介绍下Shell中的printf命令. 一.Shell printf命令语法 printf format-string [arguments...] format-string为描述格式规格的字符串,用来描述输出的排列方式,最好为

高并发架构系列:Redis为什么是单线程、及高并发快的3大原因详解

Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了很多上下文切换线程的时间: 3.redis使用多路复用技术,可以处理并发的连接.非阻塞IO 内部实现采用epoll,采用了epoll+自己实现的简单的事件框架.epoll中的读.写.关闭.连接都转化成了事件,然后利用epoll的多路复用特性,绝不在io上浪费一点时间. 下面重点介绍单线程设计和IO多路复用核心设计快的原因. 为什么Redis是单线程的 1.官方答案 因为Redis是基

objective C 内存管理及属性方法详解

oc为每个对象提供一个内部计数器,这个计数器跟踪对象的引用计数,当对象被创建或拷贝时,引用计数为1,每次保持对象时,调用retain接口,引用计数加1,如果不需要这个对象时调用release,引用计数减1,当对像的引用计数为0时,系统就会释放掉这块内存,释放对象调用dealloc 当对象包含其他对象时,就得在dealloc中自己释放他们 NSObject是IOS所有类的基类 有两个基本函数,alloc和dealloc alloc类似于C++的new,dealloc类似于delete 当对象的re

html保留字符详解

本文由 www.169it.com 搜集整理 1. 注释 HTML中的注释和其它语言注释作用相似,都是为了方便阅读和调试代码.当浏览器遇到注释时会自动忽略注释内容.HTML的注释格式多行和单行注释都用一种格式,如下: <!--注释内容--> 当页面HTML结构复杂或??容较多时,需要添加必要的注释来方便阅读和维护代码.同时,有时候为了调试代码,需要暂时注释掉一些不必要的代码,方便调试. 代码规范:需要注意的是,XHTML 1.0标准规定不要在注释中在出现双横线"--". 不