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) ...
随机推荐
- Linux启动vi编辑器时提示E325: ATTENTION解决方案
Linux启动vi编辑器时提示E325: ATTENTION解决方案 Vi编辑器是Linux的文本编辑器,在Linux系统的运用非常广泛,不少朋友在打开Vi编辑器的时候提示E325: ATTENTIO ...
- Thinkphp5 引入第三方类库的方法
原文链接:http://www.zhaisui.com/article/42.html
- SQL数据插入字符串时转义函数
函数一: std::string CheckString(std::string& strSource) { std::string strOldValue = "'"; ...
- 使用fragment添加底部导航栏
切记:fragment一定要放在framlayout中,不然不会被替换完全(就是切换之后原来的fagment可能还会存在) main.xml <LinearLayout xmlns:androi ...
- AD快捷键
* 在PCB电气层之间切换.在布线的过程中,按此键则换层并自动添加过孔并换层. Q 在公制和英制之间切换 J+C 定位到指定的元件处.在弹出的对话框内输入该元件的编号. G+G 设定栅格吸附尺寸. T ...
- IHttpHandler IHttpModule
ASP.Net处理Http Request时,使用Pipeline(管道)方式,由各个HttpModule对请求进行处理,然后到达 HttpHandler,HttpHandler处理完之后,仍经过Pi ...
- 风景区的面积及道路状况分析问题 test
参考文献: https://wenku.baidu.com/view/b6aed86baf1ffc4ffe47ac92.html #include <bits/stdc++.h> us ...
- java数字格式化
[转载] Java 提供 DecimalFormat 类,帮你用最快的速度将数字格式化为你需要的样子.下面是一个例子: importjava.text.DecimalFormat; publiccla ...
- LA 3644 易爆物
https://vjudge.net/problem/UVALive-3644 简单的并查集题目. #include<iostream> using namespace std; + ; ...
- hdu 3183 A Magic Lamp rmq或者暴力
A Magic Lamp Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Pro ...