Objective-C:对象之间循环引用会造成死循环
// A.h
// 02-循环引用
//
// Created by ma c on 15/8/14.
// Copyright (c) 2015年. All rights reserved.
// #import <Foundation/Foundation.h>
//类的前向声明(只存在包含关系中)
@class B;
@interface A : NSObject
@property(nonatomic,retain)B *b;//A获得b对象的所有权
@end
------------------------------------------------------- // A.m
// 02-循环引用
//
// Created by ma c on 15/8/14.
// Copyright (c) 2015年. All rights reserved.
// #import "A.h"
#import "B.h"
@implementation A
-(void)dealloc
{
[_b release];
NSLog(@"A dealloc");
[super dealloc];
}
@end
类B:
// B.h
// 02-循环引用
//
// Created by ma c on 15/8/14.
// Copyright (c) 2015年. All rights reserved.
// #import <Foundation/Foundation.h>
@class A;
@interface B : NSObject
@property(nonatomic,retain)A *a;//B获得a对象所有权
@end ------------------------------------------------------------ // B.m
// 02-循环引用
//
// Created by ma c on 15/8/14.
// Copyright (c) 2015年. All rights reserved.
// #import "B.h"
#import "A.h"
@implementation B
-(void)dealloc
{
//[_a release];
NSLog(@"B dealloc");
[super dealloc];
}
@end
主函数测试:
// main.m
// 02-循环引用
//
// Created by ma c on 15/8/14.
// Copyright (c) 2015年. All rights reserved.
// #import <Foundation/Foundation.h>
#import "A.h"
#import "B.h"
int main(int argc, const char * argv[])
{
@autoreleasepool
{
//测试对象间的循环引用
A *a = [[A alloc]init];
B *b = [[B alloc]init]; [a setB:b];
[b setA:a]; [a release];
[b release]; }
return ;
}
测试结果是:
Program ended with exit code:
上面的结果明显的a和b对象都没有成功释放内存而销毁,因为它们都是retain获得对方的所有权,谁都不肯先释放;
处理方法:将双方任意一方的对象属性retain做一下修改即可,改为assign
修改后测试结果如下:
-- ::27.210 -循环引用[:] A dealloc
-- ::27.211 -循环引用[:] B dealloc
Program ended with exit code:
Objective-C:对象之间循环引用会造成死循环的更多相关文章
- Python对象的循环引用问题
目录 Python对象循环引用 循环引用垃圾回收算法 容器对象 生成容器对象 追踪容器对象 结束追踪容器对象 分代容器对象链表 何时执行循环引用垃圾回收 循环引用的垃圾回收 循环引用中的终结器 pyt ...
- SQL Server 查看对象之间的引用关系
前期准备: use studioA; go create table T(X int,Y int); insert into T(X,Y) values(1,1),(2,2); ...
- [翻译] 编写高性能 .NET 代码--第二章 GC -- 减少分配率, 最重要的规则,缩短对象的生命周期,减少对象层次的深度,减少对象之间的引用,避免钉住对象(Pinning)
减少分配率 这个几乎不用解释,减少了内存的使用量,自然就减少GC回收时的压力,同时降低了内存碎片与CPU的使用量.你可以用一些方法来达到这一目的,但它可能会与其它设计相冲突. 你需要在设计对象时仔细检 ...
- 对象之间的引用传递 之 .NET中的深拷贝和浅拷贝
1.场景 首先,场景是这样的. 有一个Person类,类中有一个类型是Car的属性.用于表述,人开的车. Car类中有一些描述诸如汽车拼盘之类的属性.基本场景就是这样. 2.浅拷贝 Person ...
- c# 项目之间循环引用vs弹窗提醒
circular dependencies in projects' graph ! Projects in cycle are:ProjectImp(Name:FrameWork.Entity,Pl ...
- typescript解决深度拷贝中循环引用引起的死循环
循环引用有人说就是一种不健康的状态,即你中有我,我中有你 hasObj: any = []; deepCopy(data: any) { this.hasObj.push(data); //最终就是返 ...
- 序列化类型为“System.Data.Entity.DynamicProxies..."对象时检测到循环引用
这是因为EF外键引起的序列化问题. 解决方案: context.Configuration.ProxyCreationEnabled = false; 这里我用的是一个基类控制器用于被继承 返回EF实 ...
- 用JSON.stringify处理循环引用对象
通常,我们会用JSON.stringify把Javascript对象序列化成JSON格式,这在大多数情况下是够用的.但是,当你要转换的对象里存在循环引用时,问题就来了. js对象循环引用导致内存泄漏 ...
- javascript中的循环引用对象处理
先说明一下什么是循环引用对象: var a={"name":"zzz"}; var b={"name":"vvv"}; ...
随机推荐
- 有关FPGA
在FPGA发展历史上,前后共有过超过50家厂商,在国外目前剩下不到10家,除赛灵思和ALTERA两家持续不断地军备竞赛,其它的都有着各自固守的市场定位.即使是有新进入者,例如受英特尔新工艺支 ...
- CSU训练分类
√√第一部分 基础算法(#10023 除外) 第 1 章 贪心算法 √√#10000 「一本通 1.1 例 1」活动安排 √√#10001 「一本通 1.1 例 2」种树 √√#10002 「一本通 ...
- 机器学习之路:python 集成回归模型 随机森林回归RandomForestRegressor 极端随机森林回归ExtraTreesRegressor GradientBoostingRegressor回归 预测波士顿房价
python3 学习机器学习api 使用了三种集成回归模型 git: https://github.com/linyi0604/MachineLearning 代码: from sklearn.dat ...
- WinlogonHack获取系统密码
实验环境: win03 sp1 Gina.dll与Msgina.dll Gina.dll在NT/2000中交互式的登陆支持是由WinLogon调用Gina.dll实现的,Gina.dll提供了一个交互 ...
- 鸟哥的私房菜:Bash shell(五)-数据流重导向
数据流重定向 数据流重导向就是将某个指令执行后应该要出现在屏幕上的数据, 给他传输到其它的地方,例如档案或者是装置 (例如打印机之类的!)!这玩意儿在 Linux 的文字模式底下可重要的! 尤其是如果 ...
- 算法转AI平台工程师记录-0
--- vim源码安装: 1. git clone https://github.com/vim/vim.git 2. cd vim && ./configure --prefix=x ...
- Codeforces Round #228 (Div. 1) B. Fox and Minimal path 构造
B. Fox and Minimal path 题目连接: http://codeforces.com/contest/388/problem/B Description Fox Ciel wants ...
- HDU 1698 just a hook 线段树,区间定值,求和
Just a Hook Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1 ...
- UVALive 4867 Maximum Square 贪心
E - Maximum Square Time Limit:4500MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit ...
- HDU 5137 How Many Maos Does the Guanxi Worth 最短路 dijkstra
How Many Maos Does the Guanxi Worth Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 512000/5 ...