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"}; ...
随机推荐
- 《Android源码设计模式》--策略模式
No1: 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化. No2: 使用场景: 1)针对同一类型问题的多种处理方式,仅 ...
- Python并发编程-IO模型-IO多路复用实现SocketServer
Server.py import select import socket sk = socket.socket() sk.bind(('127.0.0.1',8080)) sk.setblockin ...
- CSS3组件化之ios版菊花loading
<div class="juhua-loading"> <div class="jh-circle1 jh-circle-ios">&l ...
- android 后台 activity 被系统回收 保存状态
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 活动被系统回收, 要保存状态 ,用到 活动的 在保存实例时候 的 这个方法. 当系统异常 ...
- UOJ 310 黎明前的巧克力(FWT)
[题目链接] http://uoj.ac/problem/310 [题目大意] 给出一个数集,A从中选择一些数,B从中选择一些数,不能同时不选 要求两者选择的数异或和为0,问方案数 [题解] 题目等价 ...
- 《学习OpenCv》 笔记(1)
P1-P17 废话 可跳过 不过讲了如何搭建环境,如果你没有搭建的话,可以查看我的另外一个博文,详细讲了如何构建OpenCv的编程环境 P19 开始编写第一个代码
- java 反射机制之 getDeclaredMethod()获取方法,然后invoke执行实例对应的方法
关于反射中getDeclaredMethod().invoke()的学习,来源于项目中的一行代码: SubjectService.class.getDeclaredMethod(autoMatchCo ...
- mysqlslap 一个MySQL数据库压力测试工具
在Xen/KVM虚拟化中,一般来说CPU.内存.网络I/O的虚拟化效率都非常高了,而磁盘I/O虚拟化效率较低,从而磁盘可能会是瓶颈.一般来说,数据库对磁盘I/O要求比较高的应用,可以衡量一下在客户机中 ...
- spring---aop(5)---Spring AOP的配置的背后的配置
写在前面 Spring AOP中Pointcut,dvice 和 Advisor三个概念 1)切入点 Pointcut 在介绍Pointcut之前,有必要先介绍 Join Point(连接点)概念. ...
- HDU 4714 Tree2cycle (树形DP)
Tree2cycle Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Others)Tot ...