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) ...
随机推荐
- MySQL-MHA集群部署(binlog复制)
MHA的理论知识网上有很多教程,这里不会说明:仅推荐博客链接! MHA的理论说明:http://www.ywnds.com/?p=8094 MHA的安装包需要在google上面下载,或者就是csdn上 ...
- dom4j解析xml报"文档中根元素后面的标记格式必须正确"
今天,在写个批量启动报盘机的自动化应用,为了简化起见,将配置信息存储在xml中,格式如下: <?xml version="1.0" encoding="UTF-8& ...
- 使用 Vue.js 结合bootstrap 实现的分页控件
原文链接:http://blog.csdn.net/qiuhaotc/article/details/53031884 源码下载: http://pan.baidu.com/s/1i4XgH6H 密码 ...
- 20145327 《网络对抗》逆向及BOF基础实践
20145327 <网络对抗>逆向及BOF基础实践 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任 ...
- BZOJ 1503 郁闷的出纳员(splay)
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1503 题意:给出一个数列(初始为空),给出一个最小值Min,当数列中的数字小于Min时自动 ...
- ubuntu16.04下编译ceres-solver
一.编译环境 ubuntu16.04 二.准备工作之安装必要的库 2.1安装cmake sudo apt-get install cmake 2.2 安装google-glog + gflags su ...
- 【第三十一章】 elk(2)- 第二种架构(最常用架构)
参考:http://linuxg.blog.51cto.com/4410110/1761757 最常用架构: 一.安装redis 1.下载:http://redis.io/download 2.解压后 ...
- [luogu2119]魔法阵 NOIP2016T4
很好的一道数学推导题 45分做法 $O(N^4)$暴力枚举四个材料 55分做法 从第一个约束条件可得到所有可行答案都是单调递增的,所以可以排序一遍,减少枚举量,可以拿到55分 100分做法 首先可以发 ...
- C#学习笔记(八):多维数组
一维数组 冒泡排序 二维数组 Length:取数组元素的总个数 GetLength:取不同维度的个数 using System; using System.Collections.Generic; u ...
- 通过java代码对kylin进行cube build
转:http://www.cnblogs.com/hark0623/p/5580632.html 通常是用于增量 代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 ...