Objective-C:MRC(引用计数器)获得对象所有权的方式(init、retain、copy等)
2024-10-21 03:24:43
.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:
最新文章
- Delphi 各版本新特性功能网址收集
- laravel安装学习步骤
- go语言 类型:数组
- Android代码混淆官方实现方法
- [css filter]filter在界面实现滤镜效果
- C#DataGridView 美化
- disabled
- [Android代码阅读]分类简介
- JSON lib 里JsonConfig详解
- c# socket传输struct类型
- linux 下 启动oracle
- python核心编写视频笔记--模块的导入
- android最火的开源项目
- jQuery匿名函数$(function(){ }
- [z]protobuf实现c++与java之间的数据传递,beancopy数据到前台
- 并发编程 —— ConcurrentHashMap size 方法原理分析
- linux下nginx配置ssl证书(https)
- ios 点击Home问题
- Workflow_工作流的基本元素(概念)
- Sublime Text2安装Package Control
热门文章
- thinkphp3.2路由美化,url简化
- Think PHP 3.2 界面及JS多语言实现
- Python并发编程系列之常用概念剖析:并行 串行 并发 同步 异步 阻塞 非阻塞 进程 线程 协程
- [leetcode sort]179. Largest Number
- windows下thrift的使用(C++)
- Form与ModelForm-下拉框或者多选注意//及字段补充
- Sublime Text 下的Install Package安装方法
- zip函数实际应用
- MyBatis之MyBatis环境搭建
- [POI2015]Myjnie