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) ...
随机推荐
- 计算两个集合的差集——第六期 Power8 算法挑战赛
第六期Power8大赛 1.1 比赛题目 题目: 计算两个集合的差集: 详细说明: 分别有集合A和B两个大数集合,求解集合A与B的差集(A中有,但B中无的元素),并将结果保存在集合C中,要求集合C中的 ...
- centos 安装最新稳定版本docker
直接yum安装的docker版本是 : docker --versionDocker version 1.12.6, build 85d7426/1.12.6 一些新特性需要安装最新的稳定版本 国内可 ...
- 对于“机器视觉(computer version)”的反思
做图像有一段时间了,几个问题进行反思,欢迎讨论 1.机器视觉的本质是什么? 我认为就是通过计算机和数学的方法,对一定形式存储的2d或3d的视觉信号进行增强.延伸,以增加信号的强度: 2.机器视觉的第一 ...
- Cron表达式详解和表达式的验证
本篇不算原创,因为主要内容来自网上的博客,所以给出我参考文章的链接. 本文cron表达式详解的大部分内容参考了[cron表达式详解]和Quartz使用总结.Cron表达式 这两篇文章. cron校验的 ...
- swift设计模式学习 - 原型模式
移动端访问不佳,请访问我的个人博客 设计模式学习的demo地址,欢迎大家学习交流 原型模式 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 定义 用原型实例指定创建对象的种类,并且通 ...
- [shiro] - 加入rememberMe功能
shiro不加入rememberMe没事,一加入就出错. RememberMeAuthenticationToken : public interface RememberMeAuthenticati ...
- 使用Hyper-V创建虚拟机
很多想使用Linux的小伙伴们不敢在自己的电脑上安装,害怕出错误删文件啥的,当然,对于新手确实很容易发生这样的事,特别是一点硬盘分区知识都木有的.这时候就要借助于虚拟机了.Windows平台下经常使用 ...
- Ubuntu16.04 无法连接WiFi
在安装完 ns-3.25 之后,着手开始准备 Eclipse 的安装,打开了 Firefox游览器 准备上网的时候,发现网络没有正常连接. 刚刚开始怀疑的是,并没有连接上网络. 于是打开了终端,pin ...
- UVa 11729 突击战
https://vjudge.net/problem/UVA-11729 题意:有n个部下,每个部下需要完成一项任务.第i个部下需要你话B分钟交代任务,然后立刻执行J分钟完成任务.安排交代任务顺序并计 ...
- 如何 Graphics 对象设置背景色
用 Clear 方法可以轻松地给 Graphics 对象设置背景色. using (Bitmap bmp = new Bitmap(width, height)){ using (Graphic ...