/*
多对象内存管理:
以人拥有车为例涉及到@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. sizeWithFont 不是线程安全。

    在ios开发中经常使用用sizeWithFont 方法来计算UILabel 的frame, 例如动态计算UITableViewCell 的高度,在主线程处理没有问题,但是在子线程用此方法来计算就会出现 ...

  2. C 语言 .h文件的作用

    C语言头文件的作用 最近在工作当中遇到了一点小问题,关于C语言头文件的应用问题,主要还是关于全局变量的定义和声明问题.学习C语言已经有好几年了,工作使用也近半年了,但是对于这部分的东西的确还没有深入的 ...

  3. win7配置nginx + php

    nginx的下载地址:  http://www.nginx.cn/nginx-download 在nginx下创建文件php-cgi.cmd,并写入内容: "D:\nginx_php-5.6 ...

  4. linux-统计行数

    wc -l ls |wc -l 查看文件夹下的行数 cat/less/more  +文件名|wc -l

  5. 打印W图案

    一:规律 二维图形的展示都可以使用二维数组来解决,W图形x轴0,1,2,1,0,1,2.....在0到2直接来回的徘徊 y轴是在一直递增........ 二:代码 @Test /** * 测试打印w图 ...

  6. JDBC的批量查询报告内存溢出解决方法

    由于表中的数据过多(我的超过了50W+),查询select * from table ....报告内存溢出 Exception in thread "main" java.lang ...

  7. [未完成][Mooc]关于线程的总结

    进程和线程.Eclipse,QQ都是进程.是程序或者任务的执行过程,是动态性.持有资源(共享内存,共享文件)和线程. 这个资源就是内存. 每个程序在运行的时候都会分配一些内存. Eclipse中的源代 ...

  8. less-2

    样式内嵌: 生成css:   样式运算:   生成的css文件:

  9. Android之简单页面跳转

    Uri.parse方法返回的是一个URL类型,通过URL可以访问一个网络上的或者本地资源,Intent()方法是调用哪个组件来打开这个URL. package com.example.web; imp ...

  10. C#_简单Excel导入

    引用程序集 Microsoft.Office.Core Microsoft.Office.Interop.Excel using System; using System.Collections.Ge ...