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) ...
随机推荐
- 高并发下,php使用uniqid函数生成唯一标识符的四种方案
PHP uniqid()函数可用于生成不重复的唯一标识符,该函数基于微秒级当前时间戳.在高并发或者间隔时长极短(如循环代码)的情况下,会出现大量重复数据.即使使用了第二个参数,也会重复,最好的方案是结 ...
- SACD ISO镜像中提取DSDIFF(DFF)、DSF文件
听语音 | 浏览:5620 | 更新:2015-08-25 11:46 | 标签:硬件 1 2 3 4 5 分步阅读 现在有一种比较流行的无损音乐传输介质是SACD ...
- 06: linux下python开发环境梳理
1.1 修改~/.bashrc文件 改编终端颜色 alias rm='rm -i' alias cp='cp -i' alias mv='mv -i' # User specific aliases ...
- 20145304 Exp8 Web基础
20145304 Exp8 Web基础 实验后回答问题 (1)什么是表单 表单用于搜集不同类型的用户输入,由三个基本组成部分表单标签.表单域.表单按钮.表单提交有两种方法,分别是get和post,使用 ...
- Salty Fish 结对学习心得体会及创意照 (20165211 20165208)
小组结对学习心得体会及创意照 在阅读了软件工程讲义 3 两人合作(2) 要会做汉堡包和现代软件工程讲义 3 结对编程和两人合作后,加之对于这几周组队学习的感悟,我们对于组队学习的一些感悟和想法如下: ...
- linux内核分析 第3章读书笔记
第三章 进程管理 一.进程 1.进程 进程就是处于执行期的程序. 进程就是正在执行的程序代码的实时结果. 进程是处于执行期的程序以及相关的资源的总称. 进程包括代码段和其他资源. 2.线程 执行线程, ...
- SQLSERVER中order by ,group by ,having where 的先后顺序
SELECT [Name] FROM [LinqToSql].[dbo].[Student] where name='***' group by name having (name='* ...
- strerror函数的总结
定义函数:char * strerror(int errnum); 函数说明:strerror()用来依参数errnum 的错误代码来查询其错误原因的描述字符串, 然后将该字符串指针返回. 返回值:返 ...
- ArchLinux For Arm 树莓派开机自启动脚本rc.local
今天折腾了下树莓派的迅雷固件,迅雷的安装很顺利,解压直接运行portal 就搞定了, 但是自启动就有问题了,由于新版的ArchLinux切换到systemd,不但rc.conf省了,连rc.local ...
- JSON类库Jackson与JSON-lib性能对比[转]
Jackson:http://jackson.codehaus.org/ JSON-lib:http://json-lib.sourceforge.net/ Gson:http://code.goog ...