OC MRC之set方法内存管理(代码分析)
//
// main.m
// 03-set方法的内存管理
//
// Created by apple on 13-8-9.
// Copyright (c) 2013年 itcast. All rights reserved.
// #import <Foundation/Foundation.h> @interface Dog : NSObject @end #import "Dog.h" @implementation Dog @end #import <Foundation/Foundation.h> @interface Car : NSObject
{
int _speed;
} - (void)setSpeed:(int)speed;
- (int)speed;
@end #import "Car.h" @implementation Car
- (void)setSpeed:(int)speed
{
_speed = speed;
}
- (int)speed
{
return _speed;
} - (void)dealloc
{
/*
_speed :直接访问成员变量
self->_speed :直接访问成员变量
self.speed : get方法
[self speed] : get方法
*/ NSLog(@"速度为%d的Car对象被回收了", _speed); [super dealloc];
}
@end #import <Foundation/Foundation.h>
#import "Car.h" @interface Person : NSObject
{
Car *_car;
int _age;
} - (void)setAge:(int)age;
- (int)age; - (void)setCar:(Car *)car;
- (Car *)car; @end #import "Person.h" // _car -> c1 0 @implementation Person
- (void)setCar:(Car *)car
{
if (car != _car)
{
// 对当前正在使用的车(旧车)做一次release
[_car release]; // 对新车做一次retain操作
_car = [car retain];
}
}
- (Car *)car
{
return _car;
} - (void)setAge:(int)age
{ // 基本数据类型不需要管理内存
_age = age;
}
- (int)age
{
return _age;
} - (void)dealloc
{
// 当人不在了,代表不用车了
// 对车做一次release操作
[_car release]; NSLog(@"%d岁的Person对象被回收了", _age); [super dealloc];
} @end #import <Foundation/Foundation.h>
#import "Car.h"
#import "Dog.h" @interface Student : NSObject
{
int _no;
NSString *_name;
Car *_car;
Dog *_dog;
} - (void)setNo:(int)no;
- (int)no; - (void)setName:(NSString *)name;
- (NSString *)name; - (void)setCar:(Car *)car;
- (Car *)car; - (void)setDog:(Dog *)dog;
- (Dog *)dog; @end #import "Student.h" @implementation Student
- (void)setNo:(int)no
{
_no = no;
}
- (int)no
{
return _no;
} - (void)setName:(NSString *)name
{
if ( name != _name )
{
[_name release];
_name = [name retain];
}
} - (NSString *)name
{
return _name;
} - (void)setCar:(Car *)car
{
if ( car != _car )
{
[_car release];
_car = [car retain];
}
}
- (Car *)car
{
return _car;
} - (void)setDog:(Dog *)dog
{
if ( dog != _dog )
{
[_dog release];
_dog = [dog retain];
}
}
- (Dog *)dog
{
return _dog;
} - (void)dealloc
{
[_name release];
[_car release];
[_dog release]; [super dealloc];
}
@end #import <Foundation/Foundation.h>
#import "Car.h"
#import "Person.h"
#import "Student.h"
#import "Dog.h"
/*
内存管理代码规范:
1.只要调用了alloc,必须有release(autorelease)
对象不是通过alloc产生的,就不需要release 2.set方法的代码规范
1> 基本数据类型:直接复制
- (void)setAge:(int)age
{
_age = age;
} 2> OC对象类型
- (void)setCar:(Car *)car
{
// 1.先判断是不是新传进来对象
if ( car != _car )
{
// 2.对旧对象做一次release
[_car release]; // 3.对新对象做一次retain
_car = [car retain];
}
} 3.dealloc方法的代码规范
1> 一定要[super dealloc],而且放到最后面
2> 对self(当前)所拥有的其他对象做一次release
- (void)dealloc
{
[_car release];
[super dealloc];
}
*/ // 速度为100的车子:
// 速度为200的车子:p1->_car int main()
{
// stu - 1
Student *stu = [[Student alloc] init]; // Car - 2
// 这行内存有内存泄露
//stu.car = [[Car alloc] init]; // stu - 0
// Car - 1
[stu release]; // 这行内存有内存泄露
// [[Car alloc] init].speed = 100; return ;
} void test3()
{
Student *stu = [[Student alloc] init]; Car *c = [[Car alloc] init];
stu.car = c; Dog *d = [[Dog alloc] init]; stu.dog = d; NSString *s = @"Jack"; stu.name = s; [d release];
[c release];
[stu release];
} void test2()
{
Person *p1 = [[Person alloc] init];
p1.age = ; // c1 - 1
Car *c1 = [[Car alloc] init];
c1.speed = ;
// c1 - 2
p1.car = c1;
// c1 - 1
[c1 release]; Car *c2 = [[Car alloc] init];
c2.speed = ;
// c1 - 0
p1.car = c2; [c2 release]; [p1 release];
} void test1()
{
// p-1
Person *p = [[Person alloc] init];
p.age = ; // c1-1
Car *c1 = [[Car alloc] init];
c1.speed = ; // c1-2
p.car = c1; // c1-1
[c1 release]; p.car = c1;
p.car = c1;
p.car = c1;
p.car = c1;
p.car = c1;
p.car = c1;
p.car = c1; [p release];
} void test()
{
// p-1
Person *p = [[Person alloc] init];
p.age = ; // c1-1
Car *c1 = [[Car alloc] init];
c1.speed = ; // p想拥有c1
// c1-2
p.car = c1; // [p setCar:c1]; // c2-1
Car *c2 = [[Car alloc] init];
c2.speed = ; // p将车换成了c2
// c1-1
// c2-2
p.car = c2; // c2-1
[c2 release];
// c1-0
[c1 release];
// p-0 c2-0
[p release];
}
OC MRC之set方法内存管理(代码分析)的更多相关文章
- OC MRC之计数器的基本操作(代码分析)
/* 1.方法的基本使用 1> retain :计数器+1,会返回对象本身 2> release :计数器-1,没有返回值 3> retainCount :获取当前的计数器 4> ...
- OC MRC之循环引用问题(代码分析)
// // main.m // 07-循环引用 // // Created by apple on 13-8-9. // Copyright (c) 2013年 itcast. All rights ...
- Keil C动态内存管理机制分析及改进(转)
源:Keil C动态内存管理机制分析及改进 Keil C是常用的嵌入式系统编程工具,它通过init_mempool.mallloe.free等函数,提供了动态存储管理等功能.本文通过对init_mem ...
- OC第三天(内存管理)
内存管理: 1.作用范围: 不论什么继承了NSObject的对象,堆基本数据类型无效如:int a ,float price;;等 2.原理: 每一个对象内部都保存了一个与之相关的整数,称为引用计数器 ...
- Linux内核内存管理子系统分析【转】
本文转载自:http://blog.csdn.net/coding__madman/article/details/51298718 版权声明:本文为博主原创文章,未经博主允许不得转载. 还是那张熟悉 ...
- iOS中引用计数内存管理机制分析
在 iOS 中引用计数是内存的管理方式,虽然在 iOS5 版本中,已经支持了自动引用计数管理模式,但理解它的运行方式有助于我们了解程序的运行原理,有助于 debug 程序. 操作系统的内存管理分成堆和 ...
- Memcached内存管理模型分析
Memcached 是一个高性能的分布式内存对象缓存系统,它通过在内存中缓存数据和对象来减少读取数据库的次数,从而减轻RDBMS的负担,提高服务的速度.提升可扩展性.本文将基于memcached1.4 ...
- memcached内存管理机制分析
memached是高性能分布式内存对象系统,通过在内存中存储数据对象来减少对磁盘的数据读取次数,提高服务速度. 从业务需求出发.我们通过一条命令(如set)将一条键值对(key,value)插入mem ...
- redis内存管理代码的目光
zmalloc.h /* zmalloc - total amount of allocated memory aware version of malloc() * * Copyright (c) ...
随机推荐
- bzoj1651 / P2859 [USACO06FEB]摊位预订Stall Reservations
P2859 [USACO06FEB]摊位预订Stall Reservations 维护一个按右端点从小到大的优先队列 蓝后把数据按左端点从小到大排序,顺序枚举. 每次把比右端点比枚举线段左端点小的数据 ...
- Java项目导出为jar包+导出第三方jar包+使用命令行调用+传参
Java项目导出为jar包+导出第三方jar包+使用命令行调用+传参 一.打包 情况1:不需要向程序传参数,并且程序没有使用第三方jar包 Eclipse上导出jar: 然后选择一个java文件作为入 ...
- vc编辑器常用设置
代码格式化 1.选中代码: 2.ctrl+K: 3.ctrl+F; 显示行号
- 20145206邹京儒《网络对抗》逆向及Bof基础实践
20145206邹京儒<网络对抗>逆向及Bof基础实践 1 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:ma ...
- C#对象的new和不new的区别
new:为对象分配空间. 首先,直接声明一个变量:byte[] test;只是有了一个变量名字,而它是没有实际空间的,需要分配空间: 分配空间的方法: 1.使用new,byte[] test = ne ...
- assert函数用法总结【转】
本文转载自:http://blog.csdn.net/u014082714/article/details/45190505 assert宏的原型定义在<assert.h>中,其作用是如果 ...
- 2016年蓝桥杯B组C/C++省赛(预选赛)题目解析
2016年蓝桥杯B组C/C++ 点击查看2016年蓝桥杯B组省赛试题(无答案版) 第一题:煤球数目 题解 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个( ...
- hystrix两种隔离模式分析
hystrix隔离模式目前有两种方式:信号量模式和线程池模式. 但信号量并不支持超时,当被调服务发生问题时,有少部分用户会长时间无法得到响应. 另外,使用线程池模式无法传递Header,我估计是由于线 ...
- ActiveMQ、RabbitMQ、RocketMQ、Kafka 对比(图示)
RabbitMQ 和 Kafka 对比,一篇好的介绍文章:https://my.oschina.net/u/236698/blog/501834 ActiveMQ.RabbitMQ.RocketMQ. ...
- 【核心API开发】Spark入门教程[3]
本教程源于2016年3月出版书籍<Spark原理.机制及应用> ,在此以知识共享为初衷公开部分内容,如有兴趣,请支持正版书籍. Spark综合了前人分布式数据处理架构和语言的优缺点,使用简 ...