博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
oc45--多对象内存管理 优化
阅读量:6569 次
发布时间:2019-06-24

本文共 2073 字,大约阅读时间需要 6 分钟。

////  main.m//  Set方法的内存管理#import 
#import "Person.h"#import "Room.h"int main(int argc, const char * argv[]) { @autoreleasepool { // 1.创建两个对象 Person *p = [[Person alloc] init]; Room *r = [[Room alloc] init]; r.no = 888; NSLog(@"%lu",[r retainCount]); // 2.将房间赋值给人 // 人需要使用这间房, 只要人在房间就一定要在 p.room = r; // [p setRoom:r] p.room = r; // [p setRoom:r] p.room = r; // [p setRoom:r] p.room = r; // [p setRoom:r] NSLog(@"%lu",[r retainCount]); [r release]; // 3.换房 Room *r2 = [[Room alloc] init]; r2.no = 444; // 有问题 p.room = r2; [r2 release]; // 在这行代码之前, 人都没有被释放 NSLog(@"-----"); // 3,人都不在了, 房间也必须销毁 [p release]; } return 0;}
////  Person.h#import 
#import "Room.h"@interface Person : NSObject{ Room *_room;}- (void)setRoom:(Room *)room;- (Room *)room;@end
////  Person.m#import "Person.h"@implementation Person// 当A对象想使用B对象一定要对B对象进行一次retain, 这样才能保证A对象存在B对象就存在, 也就是说这样才能保证无论在什么时候在A对象中都可以使用B对象// 当A对象释放的时候, 一定要对B对应进行一次release, 这样才能保证A对象释放了, B对应也会随之释放, 避免内存泄露// 总结一句话: 有增就有减- (void)setRoom:(Room *)room // room = r{    // 只有房间不同才需用release和retain    if (_room != room) {
// 0ffe1 != 0ffe1,防止了相同的set会加多次, // 将以前的房间释放掉 -1,更换room的时候将之前的room的计数器减一, [_room release]; /* 对房间的引用计数器+1 [room retain]; _room = room; */ // retain不仅仅会对引用计数器+1, 而且还会返回当前对象 _room = [room retain]; }}- (Room *)room{ return _room;}- (void)dealloc{ // 人释放了, 那么房间也需要释放 [_room release]; NSLog(@"%s", __func__); [super dealloc];}@end
//  Room.h#import 
@interface Room : NSObject @property int no;// 房间号@end
//  Room.m#import "Room.h"@implementation Room    - (void)dealloc    {        NSLog(@"%s no = %i", __func__, _no);        [super dealloc];    }@end

 

本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/7427092.html,如需转载请自行联系原作者
你可能感兴趣的文章
[转载] 七龙珠第一部——第057话 小雨对布鲁
查看>>
【5】python核心编程 第八章-条件和循环
查看>>
60. Permutation Sequence
查看>>
MapReduce编程系列 — 2:计算平均分
查看>>
MnasNet:迈向移动端机器学习模型设计的自动化之路
查看>>
Java 重写(Override)与重载(Overload)
查看>>
Javascript调试技巧整理
查看>>
Python学习笔记 - PostgreSQL的使用
查看>>
Linux常用命令
查看>>
turtle练习
查看>>
Oracle Golden Gate 系列 小结
查看>>
Oracle DBMS_STATS 包 和 Analyze 命令的区别
查看>>
【CTS】几个serialno失败项
查看>>
使用Lucene.Net实现全文检索
查看>>
多线程使用场景
查看>>
keras简单介绍与使用
查看>>
UBI系统原理-中【转】
查看>>
在vscode中使用pylint-django插件解决pylint的一些不必要的错误提示【转】
查看>>
继电器是如何成为CPU的(1)【转】
查看>>
Microsoft Security Essential: 微软安全软件
查看>>