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结构体是一个引用计数器,它被嵌套进其它的结构体中,记录所嵌套结构的引用计数.引用计数用于检测内核中有多少地方使用了某个对象,每当内核的一个部分需要某个对象所包含的信息时 ...
随机推荐
- jenkins远程连接linux配置测试
由于配置原因造成一下错误错误: jenkins.plugins.publish_over.BapPublisherException: Failed to connect session for co ...
- Python学习笔记之爬虫
爬虫调度端:启动爬虫,停止爬虫,监视爬虫运行情况 URL管理器:对将要爬取的和已经爬取过的URL进行管理:可取出带爬取的URL,将其传送给“网页下载器”网页下载器:将URL指定的网页下载,存储成一个字 ...
- Ionic Js十四:浮动框
$ionicPopover $ionicPopover 是一个可以浮在app内容上的一个视图框. 实例 HTML 代码 <p> <button ng-click="open ...
- MySQL性能优化(七·下)-- 锁机制 之 行锁
一.行锁概念及特点 1.概念:给单独的一行记录加锁,主要应用于innodb表存储引擎 2.特点:在innodb存储引擎中应用比较多,支持事务.开销大.加锁慢:会出现死锁:锁的粒度小,并发情况下,产生锁 ...
- html5+css3 手机屏幕的适配css
*{ margin:0;padding:0;outline:0}a{ text-decoration:none}body,html{ font-size:20px;font-family:'Micro ...
- 基于Thinkphp3.2的qq第三方oauth认证登录扩展类
基于Thinkphp3.2的qq第三方oauth认证登录扩展类,由于腾讯oauth sdk写的太多,不能与thinkphp和好的结合,最终想法讲腾讯oauth sdk写成tp的扩展类先看代码,将代码保 ...
- printf的定义
1. printf的宏定义 #define XXX_ERROR 0#define XXX_WARNING 1#define XXX_INFO 2#define XXX_DEBUG 3#define X ...
- 【知了堂学习笔记】java web 简单的登录
最近皮皮潇在学习java web,刚接触了简单的东西,所以今天给大家带来一个简单的登录实现. 页面: 页面代码: <%@ page language="java" conte ...
- nginx安装第三方模块
原已经安装好的nginx,现在需要添加一个未被编译安装的模块 举例说明:安装第三方的ngx_cache_purge模块(用于清除指定URL的缓存) nginx的模块是需要重新编译nginx,而不是像a ...
- C/C++ 之输入输出
因为C++向下兼容C,所以有多种输入输出的方式,cin/cout十分简洁,但个人觉得不如scanf/printf来的强大,而且在做算法题时,后者运行速度也快些. scanf/printf #inclu ...