Objective-C:MRC手动释放对象内存举例(引用计数器)
手机内存下的类的设计练习:
// Book.h
// 引用计数器
//
// Created by ma c on 15/8/13.
// Copyright (c) 2015年. All rights reserved.
// #import <Foundation/Foundation.h> @interface Book : NSObject
{
NSString *_title;
NSString *_author;
CGFloat _price;
}
-(id)initWithTitle:(NSString*)title andAuthor:(NSString*)author
AndPrice:(CGFloat)price;
-(void)setTitle:(NSString*) title;
-(void)setAuthor:(NSString*) author;
-(void)setPrice:(CGFloat) price;
-(NSString*) title;
-(NSString*) author;
-(CGFloat) price;
-(void) show;
@end
.m声明文件
// Book.m
// 引用计数器
//
// Created by ma c on 15/8/13.
// Copyright (c) 2015年. All rights reserved.
// #import "Book.h" @implementation Book
-(id)initWithTitle:(NSString*)title andAuthor:(NSString*)author
AndPrice:(CGFloat)price
{
self = [super init];
if(self)
{
_title = [title retain];
_author = [author retain];
_price = price;
}
return self;
}
-(void)setTitle:(NSString*) title
{
if(_title != title)
{
[_title release];//释放上一次拥有的对象所有权
_title = [title retain];//获取这一次的对象所有权
}
}
-(void)setAuthor:(NSString*) author
{
if(_author != author)
{
[_author release];//释放上一次拥有的对象所有权
_author = [author retain];//获取这一次的对象所有权
}
}
-(void)setPrice:(CGFloat) price
{
_price = price;
}
-(NSString*) title
{
return _title;
}
-(NSString*) author
{
return _author;
}
-(CGFloat) price
{
return _price;
}
-(void) show
{
NSLog(@"title:%@,author:%@,price:%.2f",_title,_author,_price);
}
-(void)dealloc
{
[_title release];
[_author release];
NSLog(@"title retainCount:0");
NSLog(@"author retainCount:0");
NSLog(@"book retainCount:0");
NSLog(@"book is dealloc!");
[super dealloc];
}
@end
测试Book类
// main.m
// 引用计数器
//
// Created by ma c on 15/8/13.
// Copyright (c) 2015年. All rights reserved.
// #import <Foundation/Foundation.h>
#import "Book.h"
int main(int argc, const char * argv[])
{
//@autoreleasepool { //创建书对象book并初始化
Book *book = [[Book alloc]initWithTitle:@"OC" andAuthor:@"Jobs" AndPrice:35.6];//book count:1
NSLog(@"book retainCount:%lu",[book retainCount]); //创建书名对象title
NSMutableString *title = [NSMutableString stringWithString:@"IOS"];//title count:1
NSLog(@"title retainCount:%lu",[title retainCount]); //设置书名
[book setTitle: title];//title count:2
NSLog(@"title retainCount:%lu",[title retainCount]); //创建书的作者对象author
NSMutableString *author = [NSMutableString stringWithString:@"Bill"];//author count:1
NSLog(@"author retainCount:%lu",[author retainCount]); //设置书的作者名
[book setAuthor:author];//author count:2
NSLog(@"author retainCount:%lu",[author retainCount]); //设置书的价格
[book setPrice:58.9]; //释放title对象所有权----与上面的创建title对象相对应
[title release];//title count:1
NSLog(@"title retainCount:%lu",[title retainCount]); //释放author对象所有权----与上面的创建author对象相对应
[author release];//author count:1
NSLog(@"author retainCount:%lu",[author retainCount]); //释放在book类中的成员实例变量title和author对象的所有权,并销毁book对象
[book show];
[book release];//title count:0, author count:0 ,book count:0, dealloc book
//}
return ;
}
运行结果:
-- ::49.608 引用计数器[:] book retainCount:
-- ::49.609 引用计数器[:] title retainCount:
-- ::49.610 引用计数器[:] title retainCount:
-- ::49.610 引用计数器[:] author retainCount:
-- ::49.610 引用计数器[:] author retainCount:
-- ::49.610 引用计数器[:] title retainCount:
-- ::49.610 引用计数器[:] author retainCount:
-- ::49.610 引用计数器[:] title:IOS,author:Bill,price:58.90
-- ::49.611 引用计数器[:] title retainCount:
-- ::49.611 引用计数器[:] author retainCount:
-- ::49.611 引用计数器[:] book retainCount:
-- ::49.611 引用计数器[:] book is dealloc!
Program ended with exit code:
可以看出:
Objective-C:MRC手动释放对象内存举例(引用计数器)的更多相关文章
- UNITY Destroy()和DestroyImadiate()都不会立即释放对象内存
如题,destroyimadiate是立即将物体从场景hierachy中移除,并标记为 "null",注意 是带引号的null.这是UNITY内部的一个处理技巧.关于这个技巧有很争 ...
- 手动释放linux内存cache
总有很多朋友对于Linux的内存管理有疑问,之前一篇linux下的内存管理方式似乎也没能清除大家的疑虑.而在新版核心中,似乎对这个问题提供了新的解决方法,特转出来给大家参考一下.最后,还附上我对这方法 ...
- Objective-C:ARC自动释放对象内存
ARC是cocoa系统帮你完成对象内存释放的引用计数机制 .h文件 // Person.h // 01-ARC // // Created by ma c on 15/8/13. // Copyrig ...
- linux如何手动释放linux内存
当在Linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作为caching.这个问题,貌似有不少人在问,不过都没有看到有什么很好解决的办法.那么我来谈谈这个问题 ...
- Java手动释放对象
伪代码 public void updateUser(BufferedWriter writer, BufferedReader reader) { List<User> array = ...
- 手动释放Linux内存
查看内存: [root@iZ9dp52tlpqyihuisujjswZ bin]# free -h total used free shared buff/cache available Mem: 3 ...
- 可用内存free不足 hadoop3 无法启动 手动释放缓存 cache
[root@hadoop3 hadoop]# xlfg total used free shared buff/cache availableMem: 15 0 2 0 12 14Swap: 7 0 ...
- 【cocos2d-x 3.x 学习笔记】对象内存管理
内存管理 内存管理一直是一个不易处理的问题.开发人员必须考虑分配回收的方式和时机,针对堆和栈做不同的优化处理,等等.内存管理的核心是动态分配的对象必须保证在使用完成后有效地释放内存,即管理对象的生命周 ...
- oc48--多个对象内存管理练习
// // main.m // 多个对象内存管理练习 // // ARC是Xcode帮我们生成内存释放的代码,MRC是需要我买自己写retain和release.想研究内存管理只能在MRC,管理对象就 ...
随机推荐
- ThinPHP3.2中 addAll()批量插入数据
thinkphp中model类的addAll()方法可以将数据同时添加到数据库中. 1 2 3 4 5 6 // 批量添加数据 (only MySQL) $user = M('user'); //ar ...
- 查看shell 版本
cat /etc/shells 查看本机支持的解释器: echo $SHELL 当我们直接使用./a.sh来执行这个脚本的时候,如果没有shebang,那么它就会默认用$SHELL指定的解释器,否则就 ...
- python issubclass 和 isinstance函数
Python issubclass() 函数 issubclass() 方法用于判断参数 class 是否是类型参数 classinfo 的子类. 语法: issubclass(class, clas ...
- C# 集合类-接口
所谓,程序=数据结构+算法. 我目前的日常工作就是繁琐的业务流程和增删改查之类的. 其实繁琐的业务流程也不过是改变一下数据的状态.怪不得叫,面向数据库编程.哈哈. 所以呢,了解一下各种 .net内置的 ...
- bzoj1402 Ticket to Ride 斯坦纳树 + 状压dp
给定\(n\)个点,\(m\)条边的带权无向图 选出一些边,使得\(4\)对点之间可达,询问权值最小为多少 \(n \leqslant 30, m \leqslant 1000\) 首先看数据范围,\ ...
- HDU 4641 K-string 后缀自动机 并查集
http://acm.hdu.edu.cn/showproblem.php?pid=4641 https://blog.csdn.net/asdfgh0308/article/details/4096 ...
- HTTP首部字段
HTTP首部由首部字段名和首部字段值组成,以逗号隔开.如果首部出现重复,有些浏览器优先处理第一个出现的首部,有些优先处理后者. 主要分为四大类 通用首部字段 请求首部字段 响应首部字段 实体首部字段 ...
- Jenkins 使用 maven 出现C:\Windows\system32\config\systemprofile的解决
jenkins 使用 maven 出现 C:\Windows\system32\config\systemprofile 的原因是 Jenkins 服务启动的账号使用了系统的账号,在服务里改成具体的桌 ...
- bzoj 1563
对于很多决策单调性DP问题,我们很难(但不是不可以)证明其决策满足单调性,所以感觉很像时,可以打表看是否满足. 这道题的精度(?范围)很难搞,开始生怕溢出,看了hzwer的代码,才发现用long do ...
- python开发_tkinter_小球完全弹性碰撞游戏_源码下载
完成这个小球的完全弹性碰撞游戏灵感来自于: 下面是我花了一周下班时间所编写的一个小球完全弹性碰撞游戏: 游戏初始化状态: 最下面的游标和修改小球的移动速度 ====================== ...