Objective-C:MRC(引用计数器)获得对象所有权的方式(init、retain、copy等)

.h声明文件

 1 //  Integer.h
 2 //  02-MRC
 3 //
 4 //  Created by ma c on 15/8/13.
 5 //  Copyright (c) 2015年 bjsxt. All rights reserved.
 6 //
 7
 8 #import <Foundation/Foundation.h>
 9
10 @interface Integer : NSObject
11 @property(nonatomic,assign)NSInteger i;
12 -(id)initWithI:(NSInteger) i;
13 -(void) print;
14 +(Integer *)integerWithIntger:(NSInteger) i;
15 @end

  .m实现文件

 1 //  Integer.m
 2 //  02-MRC
 3 //
 4 //  Created by ma c on 15/8/13.
 5 //  Copyright (c) 2015年 bjsxt. All rights reserved.
 6 //
 7
 8 #import "Integer.h"
 9
10 @implementation Integer
11 -(id)initWithI:(NSInteger) i
12 {
13     self = [super init];
14     if(self)
15     {
16         _i = i;
17     }
18     return self;
19 }
20 +(Integer *)integerWithIntger:(NSInteger) i
21 {
22     return [[Integer alloc]initWithI:i];
23 }
24
25 -(void) print
26 {
27     NSLog(@"i = %ld",_i);
28 }
29 -(void)dealloc
30 {
31     NSLog(@"integer dealloc");
32     [super dealloc];
33 }
34 @end

 

   主函数测试

 1 //  main.m
 2 //  02-MRC
 3 //
 4 //  Created by ma c on 15/8/13.
 5 //  Copyright (c) 2015年 bjsxt. All rights reserved.
 6 //
 7
 8 #import <Foundation/Foundation.h>
 9 #import "Integer.h"
10 int main(int argc, const char * argv[])
11 {
12     @autoreleasepool
13     {
14         //测试手动引用计数
15         //1.创建对象会获得对象所有权
16         Integer *i1 = [[Integer alloc]initWithI:10];
17         NSLog(@"retaincount = %lu",[i1 retainCount]);//1
18
19
20         //2.只通过指针赋值,不会获得对象所有权
21         Integer *i2 = i1;
22         NSLog(@"retaincount = %lu",[i2 retainCount]);//1
23
24
25         //3.通过retain会获得对象的所有权
26         [i1 retain];
27         NSLog(@"retaincount = %lu",[i1 retainCount]);//2
28
29
30         //4.将对象添加到容器中,容器中会存储对象的一个引用,会获得对象所有权
31         NSMutableArray *array = [NSMutableArray array];
32         [array addObject:i1];
33         NSLog(@"retaincount = %lu",[i1 retainCount]);//3
34
35
36         //5.通过release释放对象的所有权
37         [i1 release];
38         NSLog(@"retaincount = %lu",[i1 retainCount]);//2
39
40
41         //6.从容器中删除对象,也会释放对象所有权
42         [array removeObject:i1];
43         NSLog(@"retaincount = %lu",[i1 retainCount]);//1
44
45         //7.最后再释放一次,对象才会被正常销毁
46         [i1 release];  //此时,底层会调用dealloc方法     //0
47     }
48     return 0;
49 }

    测试结果是:

2015-08-13 17:32:36.408 02-MRC[1599:103515] retaincount = 1
2015-08-13 17:32:36.409 02-MRC[1599:103515] retaincount = 1
2015-08-13 17:32:36.410 02-MRC[1599:103515] retaincount = 2
2015-08-13 17:32:36.410 02-MRC[1599:103515] retaincount = 3
2015-08-13 17:32:36.410 02-MRC[1599:103515] retaincount = 2
2015-08-13 17:32:36.410 02-MRC[1599:103515] retaincount = 1
2015-08-13 17:32:36.410 02-MRC[1599:103515] integer dealloc
Program ended with exit code: 0
时间: 2024-08-03 23:10:08

Objective-C:MRC(引用计数器)获得对象所有权的方式(init、retain、copy等)的相关文章

Objective-C:MRC(引用计数器)在OC内部的可变对象是适用的,不可变对象是不适用的(例如 NSString、NSArray等)

引用计数和字符串 内存中的常量字符串的空间分配与其他对象不同,他们没有引用计数机制 凡是自定义的对象都有引用计数机制: OC内部中对象分为可变对象(NSMutableString等)和不可变对象(NSString.NSArray等), 不可变对象不适用于引用计数的机制,可变的对象适用引用计数机制. 1 // main.m 2 // 03-unmutableobject 3 // 4 // Created by ma c on 15/8/13. 5 // Copyright (c) 2015年 b

Objective-C:MRC手动释放对象内存举例(引用计数器)

手机内存下的类的设计练习: 设计Book类, 1.三个成员变量: title(书名)author(作者).price(价格) 2.不使用@property,自己完成存取方法(set方法,get方法) 3.加入必要其他的方法 4.并对Book类进行测试 .h声明文件 1 // Book.h 2 // 引用计数器 3 // 4 // Created by ma c on 15/8/13. 5 // Copyright (c) 2015年 bjsxt. All rights reserved. 6 /

在Objective-C中 NSString并不受引用计数器机制管理

众所周知,在Objective-C中的内存管理是通过一种叫做“引用计数器”的机制管理的. 举例, 当我声明了一个新的实例 NSData *data = [[NSData alloc] init] 现在,内存中有一个NSData类型的对象,名叫data.它的引用计数器的值为1. 如果我再次引用它的时候,他的引用计数值会+1变为2. 使用完毕后需要调用 [data release]; 来使引用计数-1.  当该值为零的时候,系统会将data实例回收掉并释放内存. 但刚刚我在Cocoachina上看到

内存管理(简介,引用计数器)

移动设备的内存及其有限,每个app所占的内存是有限制的 下列行为都会增加一个app的内存占用 1,创建一个OC对象 2,定义一个变量 3,调用一个函数或者方法 当app所占用的内存比较多时,系统会发出内存警告,这时得回收一些不需要再使用的空间.比如回收一些不需要使用的对象,变量等. 如果app占用内存过大: 系统可能会强制关闭app,造成闪退现象,影响用户体验. 所谓内存管理,就是对内存进行管理,涉及的操作有: 分配内存:比如创建一个对象,会增加内存占用 清楚内存:比如销毁一个对象,能减小内存占

写时拷贝 引用计数器模型

1.深浅拷贝的使用时机: 浅拷贝:对只读数据共用一份空间,且只释放一次空间: 深拷贝:数据的修改,的不同空间: 2.引用计数器模型 使用变量use_count,来记载初始化对象个数: (1).static模型(此处只用浅拷贝与浅赋值) #include<iostream> #include<string.h> #include<malloc.h> using namespace std; class String{ public:     String(const ch

iOS完全自学手册——[三]Objective-C语言速成,利用Objective-C创建自己的对象

1.前言 上一篇已经介绍了App Delegate.View Controller的基本概念,除此之外,分别利用storyboard和纯代码创建了第一个Xcode的工程,并对不同方式搭建项目进行了比较.这一篇文章,我准备为大家介绍一下奇葩的Objective-C语言的语法和使用.这篇文章主要讲Objective-C的理论概念. 2.学习目标 2.1 Objective-C语言面向对象的特性与其他语言(C++)类比学习,声明定义一个MyObject类,并创建这个类的实例. 2.2 Objectiv

黑马程序员-内存管理之引用计数器

1.引用计数器 每种语言都有自己的内存管理机制,当然OC也不例外.当一个对象创建的时候,系统在堆中给这个对象分配了一块存储区域,这个对象被栈中的对象指针所指向,当没有任何指针指向这个对象的时候,系统怎么释放这块对象内存呢?OC中是用引用计数器来实现的.每一个对象拥有一个引用计数器(占四个字节),当对象被创建时,自带的引用计数器的值就为1了.给对象发送retain消息时,对象的引用计数器就做+1操作,表示有指针拥有这个对象,发送release消息时引用计数器做-1操作,表示某个指针不在拥有这个对象

Objective-C - 自动引用计数器

引用计数器的基本操作 /* 1.方法的基本使用 1> retain :计数器+1,会返回对象本身 2> release :计数器-1,没有返回值 3> retainCount :获取当前的计数器 4> dealloc * 当一个对象要被回收的时候,就会调用 * 一定要调用[super dealloc],这句调用要放在最后面 2.概念 1> 僵尸对象 :所占用内存已经被回收的对象,僵尸对象不能再使用 2> 野指针 :指向僵尸对象(不可用内存)的指针,给野指针发送消息会报错

Python C API 引用计数器(三)

简介 Python的内存管理是通过对象的引用计数器来实现的,对象的创建会将引用计数器加1,被引用一次则引用计数器就会加1,反之解除引用时,则引用计数器就会减1,当Python对象的引用计数器为0的时候,则这个对象就会被回收和释放. 这种内存管理的方式是有一定的弊端的,一是它需要额外的空间维护引用计数,二是它不能解决对象的"循环引用"的问题,因此,也有很多语言比如Java并没有采用该算法做来垃圾的回收机制. Python代码实例 import sys def test_refcount(