iOS 非ARC基本内存管理系列 2-多对象内存管理(2)
/*
多对象内存管理:
以人拥有车为例涉及到@property底层set方法管理内存的实现 注意:人在换车的时候要进行当前传入的车和人所拥有的车进行判断 */
/********************************* Person.h文件 *********************************/ #import <Foundation/Foundation.h>
#import "Car.h"
@interface Person : NSObject
{
Car *_car;
} - (void)setCar:(Car *)car;
- (Car *)car; @end /********************************* Person.m文件 *********************************/
#import "Person.h" @implementation Person // 为Person类中的_car对象传入Car对象 这样“人就拥有车了”
- (void)setCar:(Car *)car
{
/*
对于这种人不停的更换车的问题,为了更严谨最好将目前人所拥有的车_car和Car类对象car做下判断
如果人目前拥有的车本身就是传入进来的车那么则没有必要对车进行替换,而且从代码角度讲会报错
如果两者不相等才意味着要更换车
*/ if (_car != car ) {
// 如果之前Person已经拥有车了,那么对Person类对象正在使用的车的引用计数减一
// 当然在第一次为Person中的_car传入Car的时候 _car = nil 在OC执行后没有任何响应 后面如果要换新车先把旧车引用计数减一
[_car release]; // 对目前Person正在使用的Car对象的引用计数加一
_car = [car retain];
}
} - (Car *)car
{
return _car;
} // Person对象在回收前调用此方法
- (void)dealloc
{
// Person对象被回收 那么将Person类对象拥有的Car对象_car对象也应该被回收
[_car release];
NSLog(@"Person对象被回收了");
[super dealloc];
}
@end /********************************* Car.h文件 *********************************/ #import <Foundation/Foundation.h> @interface Car : NSObject
{
int _speed;
} - (void)setSpeed:(int)speed;
- (int)speed;
@end /********************************* Car.m文件 *********************************/ #import "Car.h"
@implementation Car - (void)setSpeed:(int)speed
{
_speed = speed;
} - (int)speed
{
return _speed;
} - (void)dealloc
{
NSLog(@"速度为%d的Car对象被回收了",_speed);
[super dealloc];
} @end /********************************* main.文件 *************************************/
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Car.h" int main(int argc, const char * argv[])
{
Person *p = [[Person alloc] init]; Car *car1 = [[Car alloc] init];
car1.speed = ; // 人拥有第一辆车car1
[p setCar:car1]; // p.car = car1; Car *car2 = [[Car alloc] init];
car2.speed = ; // 人拥有新的车car2 这一步意味着Person中的_car不再引用car1了 那么执行完这一步必须就必须将car1对象回收 因此在为车人拥有car的时候 先将之前car的引用计数在set方法中减一
[p setCar:car2]; Car *car3 = [[Car alloc] init];
car3.speed = ; // 人拥有第三辆车car3
p.car = car3; // card3的计数=2 [car3 release]; p.car = car3; // 这行代码无效 是为了将目前人所拥有的车和给人替换的车进行做判断 [car2 release]; [car1 release];
car1 = nil; [p release];
p = nil;
return ;
}
iOS 非ARC基本内存管理系列 2-多对象内存管理(2)的更多相关文章
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(10)- VSS源代码管理
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(10)- VSS源代码管理 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 ( ...
- iOS 非ARC基本内存管理系列 -手把手教你ARC——iOS/Mac开发ARC入门和使用(转)
手把手教你ARC——iOS/Mac开发ARC入门和使用 Revolution of Objective-c 本文部分实例取自iOS 5 Toturail一书中关于ARC的教程和公开内容,仅用于技术交流 ...
- iOS 非ARC基本内存管理系列 2-多对象内存管理(3) 利用@property来自动管理内存
iOS 基本内存管理-多对象内存管理(2)中可以看到涉及到对象的引用都要手动管理内存:每个对象都需要写如下代码 // 1.对要传入的"新车"对象car和目前Person类对象所拥有 ...
- iOS 非ARC基本内存管理系列总结6 -设计微博模型
设计简单的微博模型:用User类和Status类来模拟实现 在非ARC机制下有两种方式,两者没有太大的区别之所以写了两种只是为了方便学习和对比两种写法! 第一种:没有使用atuorelease和自动释 ...
- iOS 非ARC基本内存管理系列 2-多对象内存管理(1)
单个对象的内存管理非常简单无非就是alloc对应release,retain对应release.但是如果涉及到很多对象,而且对象与对象有联系的时候该怎么去管理对象的内存呢. 比如同样一本书有好3个人购 ...
- iOS 非ARC基本内存管理系列 1-引用计数器
1.什么是内存管理 移动设备的内存极其有限,每个app所能占用的内存是有限制的 当app所占用的内存较多时,系统会发出内存警告,这时得回收一些不需要再使用的内存空间.比如回收一些不需要使用的对象.变量 ...
- iOS 非ARC基本内存管理系列 5-autorelease方法使用总结
autorelase:可以将对象交给自动释放池中,释放池销毁的时候对里面的对象做一次release操作代码如下 @autoreleasepool { Person *person = [[[Perso ...
- iOS 非ARC基本内存管理系列 4-autorelease方法和@autoreleasepool
1.autorelease 基本用法 对象执行autorelease方法时会将对象添加到自动释放池中 当自动释放池销毁时自动释放池中所有对象作release操作 对象执行autorelease方法后自 ...
- iOS 非ARC基本内存管理系列 3-循环retain和@class
1.@class 使用场景:对于循环依赖关系来说,比方A类引用B类,同时B类也引用A类: 可以看出Person和Card互相引用,此时如果使用#import编译报错!因此当使用@class在两个类中相 ...
随机推荐
- search result
https://github.com/search?l=java&p=86&q=Floating+window&type=Code&utf8=%E2%9C%93http ...
- Unity NGUI 描点控件的位移动画
要让一个描点的控件动画移动到一个Position,能够用TweenPosition.可是这个仅仅能用在Position是固定的情况下.并且不能依据分辨率适配来进行移动. 以NGUI自带的 ...
- as 中的反射 describeType
describeType函数在adobe官方在线文档上的定义如下:生成描述ActionScript对象(命令为方法的参数)的XML对象,此方法实现ActionScript语言的反射编程概念. 这个方法 ...
- 高并发网络编程之epoll详解
select.poll和epoll的区别 在linux没有实现epoll事件驱动机制之前,我们一般选择用select或者poll等IO多路复用的方法来实现并发服务程序.在大数据.高并发.集群等一些名词 ...
- mysql索引需要了解的几个注意
板子之前做过2年web开发培训(入门?),获得挺多学生好评,这是蛮有成就感的一件事,准备花点时间根据当时的一些备课内容整理出一系列文章出来,希望能给更多人带来帮助,这是系列文章的第一篇 注:科普文章一 ...
- <label>标签for属性的妙用
在用户注册的时候,常常用户点击文字就需要将光标聚焦到对应的表单上面,这个是怎么实现的呢?就是下面我要介绍的<label>标签的for属性 定义:for 属性规定 label 与哪个表单元素 ...
- HBase-初看HBase
0.95版本hbase 单机模式下所有的服务都运行在一个JVM上,包括HBase和zookeeper.使用的是本地文件系统 日志默认放在目录下logs文件夹中 基本命令: create 'table' ...
- 总结nonatomic,assigncopy,retain
nonatomic:非原子性访问,不加同步,多线程并发访问会提高性能.如果不加此属性,则默认是两个访问方法都为原子型事务访问. (atomic是Objc使用的一种线程保护技术,基本上来讲,是防止在写未 ...
- Update DN with Procedure
Update DN )) LANGUAGE SQL MODIFIES SQL DATA BEGIN -- Step 1 UPDATE DNRITM A SET (DNITTQTY, DNIREQTY) ...
- windows下安装swoole。
服务器是用了Linux环境,所以安装swoole的过程只要看看文档就好了. 由于编写代码环境是在windows上,需要在windows上安装swoole.以便测试. 好了废话不多说,我们看官网文档解决 ...