/*
多对象内存管理:
以人拥有车为例涉及到@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)的更多相关文章

  1. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(10)- VSS源代码管理

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(10)- VSS源代码管理 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    ( ...

  2. iOS 非ARC基本内存管理系列 -手把手教你ARC——iOS/Mac开发ARC入门和使用(转)

    手把手教你ARC——iOS/Mac开发ARC入门和使用 Revolution of Objective-c 本文部分实例取自iOS 5 Toturail一书中关于ARC的教程和公开内容,仅用于技术交流 ...

  3. iOS 非ARC基本内存管理系列 2-多对象内存管理(3) 利用@property来自动管理内存

    iOS 基本内存管理-多对象内存管理(2)中可以看到涉及到对象的引用都要手动管理内存:每个对象都需要写如下代码 // 1.对要传入的"新车"对象car和目前Person类对象所拥有 ...

  4. iOS 非ARC基本内存管理系列总结6 -设计微博模型

    设计简单的微博模型:用User类和Status类来模拟实现 在非ARC机制下有两种方式,两者没有太大的区别之所以写了两种只是为了方便学习和对比两种写法! 第一种:没有使用atuorelease和自动释 ...

  5. iOS 非ARC基本内存管理系列 2-多对象内存管理(1)

    单个对象的内存管理非常简单无非就是alloc对应release,retain对应release.但是如果涉及到很多对象,而且对象与对象有联系的时候该怎么去管理对象的内存呢. 比如同样一本书有好3个人购 ...

  6. iOS 非ARC基本内存管理系列 1-引用计数器

    1.什么是内存管理 移动设备的内存极其有限,每个app所能占用的内存是有限制的 当app所占用的内存较多时,系统会发出内存警告,这时得回收一些不需要再使用的内存空间.比如回收一些不需要使用的对象.变量 ...

  7. iOS 非ARC基本内存管理系列 5-autorelease方法使用总结

    autorelase:可以将对象交给自动释放池中,释放池销毁的时候对里面的对象做一次release操作代码如下 @autoreleasepool { Person *person = [[[Perso ...

  8. iOS 非ARC基本内存管理系列 4-autorelease方法和@autoreleasepool

    1.autorelease 基本用法 对象执行autorelease方法时会将对象添加到自动释放池中 当自动释放池销毁时自动释放池中所有对象作release操作 对象执行autorelease方法后自 ...

  9. iOS 非ARC基本内存管理系列 3-循环retain和@class

    1.@class 使用场景:对于循环依赖关系来说,比方A类引用B类,同时B类也引用A类: 可以看出Person和Card互相引用,此时如果使用#import编译报错!因此当使用@class在两个类中相 ...

随机推荐

  1. QProcess调用外部程序方式的差异

    众所周知QProcess类的作用是启动一个外部的程序并与之交互它有三种方式调用外部程序: 1. execute 2. start 3. startDetached 从调用上看: execute是阻塞调 ...

  2. Asp.net 使用正则和网络编程抓取网页数据(有用)

    Asp.net 使用正则和网络编程抓取网页数据(有用) Asp.net 使用正则和网络编程抓取网页数据(有用) /// <summary> /// 抓取网页对应内容 /// </su ...

  3. C#使用SOAP获取webservice实例解析

    本文主要參考例如以下两个链接.并整理: Java使用SOAP: http://www.cnblogs.com/linjiqin/archive/2012/05/07/2488880.html C# s ...

  4. Hibernate的回调与拦截

    在Hibernate中,有两种方式可以捕获实体对象的GRUD操作并执行相应的处理 Hibernate回调(org.hibernate.classic.Lifecycle接口): //Provides ...

  5. [改善Java代码]自由选择字符串拼接方法

    对一个字符串拼接有三种方法:加号,contact方法,StringBuffer或者StringBuilder的append方法,其中加号是最常用的.其他两种方式偶尔会出现在一些开源项目中,那么这三者有 ...

  6. Eclipse输入任意字母或指定字符出现提示框

    Eclipse默认是输入"."的时候会有提示框提示对应的API. 如果想更方便的输入任意字母或者指定的符号出现提示框设置如下: 打开Eclipse,选中“Window”->& ...

  7. 关于Linux系统和Windows系统中文件夹的命名规范

    Windows系统中. 1.在创建文件夹的时候不能以"."开头(但是文件以多个点开头并且还有其他合法字符的话就是合法的) 但是在windows系统中确实见过以一个点".& ...

  8. poj 2104 划分树

    思路:裸的划分树 #include<iostream> #include<algorithm> #include<cstring> #include<cstd ...

  9. input两种默认显示文字方式

    First Note: placeholder属性 规定帮助用户填写输入字段的提示,值不会被提交, 且该提示会在输入字段为空时显示,并会在字段获得焦点时消失. 如 <input type=&qu ...

  10. 随机生成MyEclipse注册码

    package com.registercode; import java.io.BufferedReader;import java.io.IOException;import java.io.In ...