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 //
 7
 8 #import <Foundation/Foundation.h>
 9
10 @interface Book : NSObject
11 {
12     NSString *_title;
13     NSString *_author;
14     CGFloat _price;
15 }
16 -(id)initWithTitle:(NSString*)title andAuthor:(NSString*)author
17             AndPrice:(CGFloat)price;
18 -(void)setTitle:(NSString*) title;
19 -(void)setAuthor:(NSString*) author;
20 -(void)setPrice:(CGFloat) price;
21 -(NSString*) title;
22 -(NSString*) author;
23 -(CGFloat) price;
24 -(void) show;
25 @end

      .m声明文件

 1 //  Book.m
 2 //  引用计数器
 3 //
 4 //  Created by ma c on 15/8/13.
 5 //  Copyright (c) 2015年 bjsxt. All rights reserved.
 6 //
 7
 8 #import "Book.h"
 9
10 @implementation Book
11 -(id)initWithTitle:(NSString*)title andAuthor:(NSString*)author
12             AndPrice:(CGFloat)price
13 {
14     self = [super init];
15     if(self)
16     {
17         _title = [title retain];
18         _author = [author retain];
19         _price = price;
20     }
21     return self;
22 }
23 -(void)setTitle:(NSString*) title
24 {
25     if(_title != title)
26     {
27       [_title release];//释放上一次拥有的对象所有权
28       _title = [title retain];//获取这一次的对象所有权
29     }
30 }
31 -(void)setAuthor:(NSString*) author
32 {
33     if(_author != author)
34     {
35       [_author release];//释放上一次拥有的对象所有权
36       _author = [author retain];//获取这一次的对象所有权
37     }
38 }
39 -(void)setPrice:(CGFloat) price
40 {
41     _price = price;
42 }
43 -(NSString*) title
44 {
45     return _title;
46 }
47 -(NSString*) author
48 {
49     return _author;
50 }
51 -(CGFloat) price
52 {
53     return _price;
54 }
55 -(void) show
56 {
57     NSLog(@"title:%@,author:%@,price:%.2f",_title,_author,_price);
58 }
59 -(void)dealloc
60 {
61     [_title release];
62     [_author release];
63     NSLog(@"title retainCount:0");
64     NSLog(@"author retainCount:0");
65     NSLog(@"book retainCount:0");
66     NSLog(@"book is dealloc!");
67     [super dealloc];
68 }
69 @end

    测试Book类

 1 //  main.m
 2 //  引用计数器
 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 "Book.h"
10 int main(int argc, const char * argv[])
11 {
12     //@autoreleasepool {
13
14         //创建书对象book并初始化
15         Book *book = [[Book alloc]initWithTitle:@"OC" andAuthor:@"Jobs" AndPrice:35.6];//book count:1
16         NSLog(@"book retainCount:%lu",[book retainCount]);
17
18         //创建书名对象title
19         NSMutableString *title = [NSMutableString stringWithString:@"IOS"];//title count:1
20         NSLog(@"title retainCount:%lu",[title retainCount]);
21
22         //设置书名
23         [book setTitle: title];//title count:2
24         NSLog(@"title retainCount:%lu",[title retainCount]);
25
26         //创建书的作者对象author
27         NSMutableString *author = [NSMutableString stringWithString:@"Bill"];//author count:1
28         NSLog(@"author retainCount:%lu",[author retainCount]);
29
30         //设置书的作者名
31         [book setAuthor:author];//author count:2
32         NSLog(@"author retainCount:%lu",[author retainCount]);
33
34
35         //设置书的价格
36         [book setPrice:58.9];
37
38
39         //释放title对象所有权----与上面的创建title对象相对应
40         [title release];//title count:1
41         NSLog(@"title retainCount:%lu",[title retainCount]);
42
43         //释放author对象所有权----与上面的创建author对象相对应
44         [author release];//author count:1
45         NSLog(@"author retainCount:%lu",[author retainCount]);
46
47
48         //释放在book类中的成员实例变量title和author对象的所有权,并销毁book对象
49         [book show];
50         [book release];//title count:0, author count:0 ,book count:0, dealloc book
51     //}
52     return 0;
53 }

    运行结果:

2015-08-13 16:56:49.608 引用计数器[1527:94167] book retainCount:1
2015-08-13 16:56:49.609 引用计数器[1527:94167] title retainCount:1
2015-08-13 16:56:49.610 引用计数器[1527:94167] title retainCount:2
2015-08-13 16:56:49.610 引用计数器[1527:94167] author retainCount:1
2015-08-13 16:56:49.610 引用计数器[1527:94167] author retainCount:2
2015-08-13 16:56:49.610 引用计数器[1527:94167] title retainCount:1
2015-08-13 16:56:49.610 引用计数器[1527:94167] author retainCount:1
2015-08-13 16:56:49.610 引用计数器[1527:94167] title:IOS,author:Bill,price:58.90
2015-08-13 16:56:49.611 引用计数器[1527:94167] title retainCount:0
2015-08-13 16:56:49.611 引用计数器[1527:94167] author retainCount:0
2015-08-13 16:56:49.611 引用计数器[1527:94167] book retainCount:0
2015-08-13 16:56:49.611 引用计数器[1527:94167] book is dealloc!
Program ended with exit code: 0

可以看出:

计数器:retainCount

对象中存储被引用的次数,

当被引用的时候,计数器加1;

不在引用的时候,计数器减1;

当计数器为0的时候,真正去销毁对象。

时间: 2024-10-13 19:33:22

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

手动释放linux内存cache

转载于:http://linux.cn/article-211-1.html 总有很多朋友对于Linux的内存管理有疑问,之前一篇linux下的内存管理方式似乎也没能清除大家的疑虑. 而在新版核心中,似乎对这个问题提供了新的解决方法,特转出来给大家参考一下.最后,还附上我对 这方法的意见,欢迎各位一同讨论. 当在Linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放, 而是一直作为caching.这个问题,貌似有不少人在问,不过都没有看到有什么很好解决的办法. 那么我

Objective-C:ARC自动释放对象内存

ARC是cocoa系统帮你完成对象内存释放的引用计数机制 .h文件 1 // Person.h 2 // 01-ARC 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 Person : NSObject 11 @property(nonatomi

如何手动释放linux内存?

在生产过程中,一些java模块会比较残忍的吃系统内存,然后如果这个模块写的比较挫,产生的垃圾就会比较多,如果linux系统的内存释放也不会及时,然后恶性循环,最后就把进程卡死,但是服务器是不可以down机的,所以这个时候就需要我们运维出来,手动的释放内存. 首先,我们登陆一台服务器,#free -m看一下目前的情况: 然后#cat /proc/sys/vm/drop_caches,会看到里面的值是0,0是不释放的意思. #sync,将系统缓存区中的脏数据写入磁盘中,包括已修改的i-node.已延

手动释放linux内存和缓存

/proc/sys/vm/drop_caches (since Linux 2.6.16)Writing to this file causes the kernel to drop clean caches,dentries and inodes from memory, causing that memory to becomefree.To free pagecache, use echo 1 > /proc/sys/vm/drop_caches; tofree dentries and

黑马程序员---OC基础7【ARC概念】【ARC对象内存管理】【分类Category】

------- iOS培训.Android培训.Java培训.期待与您交流! ---------- [ARC概念]   1.指针的分类 1)强指针,默认的情况下,所有的指针都是强指针,关键字strong: 2)弱指针,_ _weak关键字修饰符的指针 2.ARC概念 自动引用计数 永远不要写retain和release.autorelease三个关键字 编译器会在编译的时候自动插入retain和release.autorelease, 是一个编译器的特性:“垃圾回收”是运行时的特性 3.ARC工

【cocos2d-x 3.x 学习笔记】对象内存管理

内存管理 内存管理一直是一个不易处理的问题,开发者必须考虑分配回收的方式和时机,针对堆和栈做不同的优化处理,等等.内存管理的核心是动态分配的对象必须保证在使用完毕后有效地释放内存,即管理对象的生命周期.由于C++是一个较为底层的语言,其设计上不包含任何智能管理内存的机制.一个对象在使用完毕后必须被回收,然而在复杂的程序中,对象所有权在不同程序片段间传递或共享,使得确定回收的时机十分困难,因此内存管理成为了程序员十分头疼的问题. 另一方面,过于零散的对象分配回收可能导致堆中的内存碎片化,降低内存的

iOS内存管理机制解析之MRC手动引用计数机制

前言: iOS的内存管理机制ARC和MRC是程序员参加面试基本必问的问题,也是考察一个iOS基本功是 否扎实的关键,这样深入理解内存管理机制的重要性就不言而喻了. iOS内存管理机制发展史 iOS 5以前 :MRC(手动引用计数) iOS 5及以后:ARC (自动引入计数) MRC机制时代 "谁开辟申请,谁及时合理释放" 面对自己申请的内存空间是要及时进行回收的: 不及时释放会造成什么结果? 对象存储在栈上,可能会大量的占用内存,内存不足造成程序闪退(也就是所说的内存泄露) 不合理释放

CentOS5.8 x86_64系统手动释放内存

线上集群后端某台Web服务器,我们观察到+buffers/cache值(即Linux内存的实际使用情况)一直都是5365左右,就算停掉Nginx+FastCGI程序也是一样,考虑到这台机器经常在使用rsync+inotify,肯定会存在着频繁存取文件.而Linux系统有一个特性:在Linux下频繁存取文件时,就会占用物理内存.当程序结束时并不会自动释放被占用的内存,而是一直作为Cache存在.实际上内核结束一个程序后,它是会释放内存的,但是内核并没有立刻将这部分收集到free当中,而是存在在ca

Linux手动释放内存

手动释放内存 1.sync将内存中的缓存写入磁盘 2.  to free pagecache, use echo 1 > /proc/sys/vm/drop_caches; to free dentries and inodes, use echo 2 > /proc/sys/vm/drop_caches;  to free pagecache, dentries and inodes, use echo 3 >/proc/sys/vm/drop_caches.