Objective-C:MRC(引用计数器)获得对象所有权的方式(init、retain、copy等)
.h声明文件
- // Integer.h
- // 02-MRC
- //
- // Created by ma c on 15/8/13.
- // Copyright (c) 2015年. All rights reserved.
- //
- #import <Foundation/Foundation.h>
- @interface Integer : NSObject
- @property(nonatomic,assign)NSInteger i;
- -(id)initWithI:(NSInteger) i;
- -(void) print;
- +(Integer *)integerWithIntger:(NSInteger) i;
- @end
.m实现文件
- // Integer.m
- // 02-MRC
- //
- // Created by ma c on 15/8/13.
- // Copyright (c) 2015年. All rights reserved.
- //
- #import "Integer.h"
- @implementation Integer
- -(id)initWithI:(NSInteger) i
- {
- self = [super init];
- if(self)
- {
- _i = i;
- }
- return self;
- }
- +(Integer *)integerWithIntger:(NSInteger) i
- {
- return [[Integer alloc]initWithI:i];
- }
- -(void) print
- {
- NSLog(@"i = %ld",_i);
- }
- -(void)dealloc
- {
- NSLog(@"integer dealloc");
- [super dealloc];
- }
- @end
主函数测试
- // main.m
- // 02-MRC
- //
- // Created by ma c on 15/8/13.
- // Copyright (c) 2015年. All rights reserved.
- //
- #import <Foundation/Foundation.h>
- #import "Integer.h"
- int main(int argc, const char * argv[])
- {
- @autoreleasepool
- {
- //测试手动引用计数
- //1.创建对象会获得对象所有权
- Integer *i1 = [[Integer alloc]initWithI:];
- NSLog(@"retaincount = %lu",[i1 retainCount]);//1
- //2.只通过指针赋值,不会获得对象所有权
- Integer *i2 = i1;
- NSLog(@"retaincount = %lu",[i2 retainCount]);//1
- //3.通过retain会获得对象的所有权
- [i1 retain];
- NSLog(@"retaincount = %lu",[i1 retainCount]);//2
- //4.将对象添加到容器中,容器中会存储对象的一个引用,会获得对象所有权
- NSMutableArray *array = [NSMutableArray array];
- [array addObject:i1];
- NSLog(@"retaincount = %lu",[i1 retainCount]);//3
- //5.通过release释放对象的所有权
- [i1 release];
- NSLog(@"retaincount = %lu",[i1 retainCount]);//2
- //6.从容器中删除对象,也会释放对象所有权
- [array removeObject:i1];
- NSLog(@"retaincount = %lu",[i1 retainCount]);//1
- //7.最后再释放一次,对象才会被正常销毁
- [i1 release]; //此时,底层会调用dealloc方法 //
- }
- return ;
- }
测试结果是:
- -- ::36.408 -MRC[:] retaincount =
- -- ::36.409 -MRC[:] retaincount =
- -- ::36.410 -MRC[:] retaincount =
- -- ::36.410 -MRC[:] retaincount =
- -- ::36.410 -MRC[:] retaincount =
- -- ::36.410 -MRC[:] retaincount =
- -- ::36.410 -MRC[:] integer dealloc
- Program ended with exit code:
Objective-C:MRC(引用计数器)获得对象所有权的方式(init、retain、copy等)的更多相关文章
- Objective-C:MRC(引用计数器)在OC内部的可变对象是适用的,不可变对象是不适用的(例如 NSString、NSArray等)
引用计数和字符串 内存中的常量字符串的空间分配与其他对象不同,他们没有引用计数机制 凡是自定义的对象都有引用计数机制: OC内部中对象分为可变对象(NSMutableString等)和不可变对象(NS ...
- OC语法6——内存管理之引用计数器(retain,release)
OC内存管理: 一.引用计数器: Java有垃圾回收机制(Garbage Collection,GC).也就是说当我们创建对象后,不需要考虑回收内存的事,Java的垃圾回收机制会自动销毁该对象,回收它 ...
- Objective-C:MRC手动释放对象内存举例(引用计数器)
手机内存下的类的设计练习: 设计Book类, 1.三个成员变量: title(书名)author(作者).price(价格) 2.不使用@property,自己完成存取方法(set方法,get方 ...
- iOS内存管理系列之一:对象所有权与引用计数
当一个所有者(owner,其本身可以是任何一个Objective-C对象)做了以下某个动作时,它拥有对一个对象的所有权(ownership): 1. 创建一个对象.包括使用任何名称中包含“alloc” ...
- C语言的引用计数与对象树
引用计数与对象树 cheungmine 2013-12-28 0 引言 我们经常在C语言中,用指针指向一个对象(Object)的结构,也称为句柄(Handle),利用不透明指针的技术把结构数据封装成对 ...
- OC-内存管理-基本原理与引用计数器
基本原理 1. 什么是内存管理 移动设备的内存极其有限,每个app所能占用的内存是有限制的 当app所占用的内存较多时,系统会发出内存警告,这时得回收一些不需要再使用的内存空间.比如回收一些不需要使用 ...
- iOS完全自学手册——[三]Objective-C语言速成,利用Objective-C创建自己的对象
1.前言 上一篇已经介绍了App Delegate.View Controller的基本概念,除此之外,分别利用storyboard和纯代码创建了第一个Xcode的工程,并对不同方式搭建项目进行了比较 ...
- Unity 游戏框架搭建 (二十二) 简易引用计数器
引用计数是一个很好用的技术概念,不要被这个名字吓到了.首先来讲讲引用计数是干嘛的. 引用计数使用场景 有一间黑色的屋子,里边有一盏灯.当第一个人进屋的时候灯会打开,之后的人进来则不用再次打开了,因为已 ...
- Linux内核引用计数器kref结构
1.前言 struct kref结构体是一个引用计数器,它被嵌套进其它的结构体中,记录所嵌套结构的引用计数.引用计数用于检测内核中有多少地方使用了某个对象,每当内核的一个部分需要某个对象所包含的信息时 ...
随机推荐
- CentOS 升级Python3.X和pip3
目的:实现python3 and python2 共存,pip2 and pip3共存 一.安装依赖 yum install openssl-devel -y yum install zlib-dev ...
- react-native第一次开发记录
1.安装指定版本 react-native init demo --verbose --version 0.41.0 2.更新依赖包 npm install -g npm-check-updates ...
- 【知了堂学习笔记】java 接口与抽象类
本次主角:抽象类 .接口. 对于皮皮潇这样一类的Java初学者来说,接口和抽象类如果不去花大量的精力与时间是很难弄清楚的,而我也是在最近这周的项目学习中感觉到了我对这两个概念不熟悉,所以导致对一些问题 ...
- Oracle数据库多表查询,子查询,集合运算
记得自己要敲o~~~ select * from bonus; select * from salgrade; from dual; --笛卡尔积:两张表的乘积 select * from emp,d ...
- [leetcode tree]101. Symmetric Tree
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For e ...
- BlocksKit(2)-DynamicDelegate
BlocksKit(2)-DynamicDelegate 动态代理可以说是这个Block里面最精彩的一部分了,可以通过自己给一个类的的协议方法指定对应的block来实现让这个协议的回调都直接在bloc ...
- java后台接收json数据,报错com.alibaba.fastjson.JSONObject cannot be cast to xxx
从前台接收json封装的list数据,在后台接收时一直报错,com.alibaba.fastjson.JSONObject cannot be cast to xxx, 使用这种方式接收可以接收 @R ...
- bzoj 2466 异或方程组
对于每个灯,我们用一个变量表示其决策,xu=0表示不选,xu=1表示选.因为每个灯最后必须都亮,所以每个等都对应一个异或方程. 解这个异或方程组,有几种情况: 1.存在唯一解(得到的上三角系数矩阵的主 ...
- Python168的学习笔记4
关于普通文本文件的读写 python2.7中,未注明的字符都是以acsii来编码的,而要让字符能够通用,必须声明为unicode. s=u'你好',s.encode('utf8')就是指用utf8来进 ...
- Codeforces Round #357 (Div. 2) C. Heap Operations 模拟
C. Heap Operations 题目连接: http://www.codeforces.com/contest/681/problem/C Description Petya has recen ...