/*
多对象内存管理:
以人拥有车为例涉及到@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. pydev+python+Eclipse环境搭建+ 调试快捷键汇总

    http://www.cnblogs.com/Bonker/p/3584707.html 编辑器: Eclipse + pydev插件 1. Eclipse是写JAVA的IDE, 这样就可以通用了,学 ...

  2. IOS 小技巧积累

    转自:http://blog.csdn.net/mars2639/article/details/7352012 1. 使用@property和@synthesize声明一个成员变量,给其赋值是时要在 ...

  3. Linux下vim配置详解

    转自http://www.cnblogs.com/witcxc/archive/2011/12/28/2304704.html

  4. requestFileSystem is undefined

    使用phonegap 3时,用File API,不应该用cordova plugin add org.apache.cordova.file等添加File API Plugin. 要用: phoneg ...

  5. B. Little Dima and Equation

    time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...

  6. ASP.NET弹出模态对话框【转】

    主页面 PageBase.aspx.cs 中的代码 protected void Page_Load(object sender, EventArgs e) {    if (!this.IsPost ...

  7. 使用 MJ 自定义下拉刷新

    // // ViewController.m // Refresh // // Created by Apple on 16/7/19. // Copyright © 2016年 mac. All r ...

  8. Recovery启动流程(3)--recovery.cpp分析

    转载请注明来源:cuixiaolei的技术博客 这篇文章主要通过分析高通recovery目录下的recovery.cpp源码,对recovery启动流程有一个宏观的了解.MTK和高通的recovery ...

  9. CSS: Float a div on another div, Ex: Text caption on picture

    <style type="text/css"> .figure { width: 316px; height: 205px; display: block; borde ...

  10. C#中登录验证FormsAuthentication

    1:前台编写一个登录界面,这里为了简化,只有用户名和密码 代码如下: <form method="post" action="/User/CheckLogin&qu ...