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年. 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年. 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年. 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的时候,真正去销毁对象。
程序猿神奇的手,每时每刻,这双手都在改变着世界的交互方式!


本文转自当天真遇到现实博客园博客,原文链接:http://www.cnblogs.com/XYQ-208910/p/4727911.html,如需转载请自行联系原作者
目录
相关文章
|
2月前
|
存储 安全 Java
synchronized原理-字节码分析、对象内存结构、锁升级过程、Monitor
本文分析的问题: 1. synchronized 字节码文件分析之 monitorenter、monitorexit 指令 2. 为什么任何一个Java对象都可以成为一把锁? 3. 对象的内存结构 4. 锁升级过程 (无锁、偏向锁、轻量级锁、重量级锁) 5. Monitor 是什么、源码查看(hotspot虚拟机源码) 6. JOL工具使用
|
7天前
|
设计模式 缓存 Java
Java设计模式:享元模式实现高效对象共享与内存优化(十一)
Java设计模式:享元模式实现高效对象共享与内存优化(十一)
|
11天前
|
存储 Java C++
Java虚拟机(JVM)管理内存划分为多个区域:程序计数器记录线程执行位置;虚拟机栈存储线程私有数据
Java虚拟机(JVM)管理内存划分为多个区域:程序计数器记录线程执行位置;虚拟机栈存储线程私有数据,如局部变量和操作数;本地方法栈支持native方法;堆存放所有线程的对象实例,由垃圾回收管理;方法区(在Java 8后变为元空间)存储类信息和常量;运行时常量池是方法区一部分,保存符号引用和常量;直接内存非JVM规范定义,手动管理,通过Buffer类使用。Java 8后,永久代被元空间取代,G1成为默认GC。
22 2
|
19天前
|
存储 缓存 JavaScript
JavaScript内存泄漏通常发生在对象不再需要时
【6月更文挑战第16天】JavaScript内存泄漏常由闭包引起,当不再需要的对象仍被闭包引用时,垃圾回收机制无法清理。例如,创建返回大型对象引用的闭包函数会导致内存泄漏。避免泄漏需及时解除引用,清除事件监听器,利用WeakMap或WeakSet,以及定期清理缓存。使用性能分析工具监控内存使用也有助于检测和解决问题。
27 8
|
15天前
|
算法 Java 程序员
Python内存管理用引用计数(对象的`ob_refcnt`)跟踪对象,但循环引用(如A-&gt;B-&gt;A)可导致内存泄漏。
【6月更文挑战第20天】Python内存管理用引用计数(对象的`ob_refcnt`)跟踪对象,但循环引用(如A-&gt;B-&gt;A)可导致内存泄漏。为解决此问题,Python使用`gc`模块检测并清理循环引用,可通过`gc.collect()`手动回收。此外,Python结合标记清除和分代回收策略,针对不同生命周期的对象优化垃圾回收效率,确保内存有效释放。
15 3
|
17天前
|
算法 Java
Java垃圾回收(Garbage Collection,GC)是Java虚拟机(JVM)的一种自动内存管理机制,用于在运行时自动回收不再使用的对象所占的内存空间
【6月更文挑战第18天】Java的GC自动回收内存,包括标记清除(产生碎片)、复制(效率低)、标记整理(兼顾连续性与效率)和分代收集(区分新生代和老年代,用不同算法优化)等策略。现代JVM通常采用分代收集,以平衡性能和内存利用率。
39 3
|
7天前
|
存储 缓存 Java
Java对象内存布局深度解析
Java对象内存布局深度解析
12 0
|
8天前
|
监控 算法 Java
掌握Java内存管理:对象生命周期与垃圾回收机制
本文旨在为读者提供一次深入的探索之旅,穿越Java虚拟机(JVM)的迷宫,揭示对象从诞生到消亡的奥秘。我们将一起揭开内存分配、存活判定以及回收策略等概念背后的神秘面纱,通过案例分析与实践技巧,让读者能够更加高效地运用Java语言,优化程序性能。
|
9天前
|
存储 缓存 算法
JVM对象创建与内存分配机制
该类对应的java.lang.Class 对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。
14 0
|
2月前
|
存储 安全 Java
Python中的引用和赋值机制允许变量引用内存中的对象,并通过引用计数来管理对象的生命周期
【5月更文挑战第14天】Python中的变量是对象引用,不存储数据,而是在内存中创建对象。赋值操作创建新变量并使其指向已有对象。引用计数用于管理对象生命周期,引用数为0时对象被回收。理解这些机制对编写高效Python代码很重要。
38 6