object-c的Dealloc

Objective-C中的dealloc方法:置nil vs. release 在dealloc方法中,我们通常需要处理对象持有的其他对象,这就引出了将对象置为nil和将对象release的问题。在这篇文章中,我们将讨论在dealloc方法中将对象置为nil和将对象release的区别,并提供相应的源代码示例。综上所述,将对象置为nil是为了防止野指针错误,而将对象release是手动释放对象内存的方法。将对象release是一种手动释放对象内存的方法。在上面的示例中,self.someObject是一个对象的成员变量或属性,将其置为nil可以确保在对象被释放后,不再持有该对象。 阅读详情
当你自己的类中包含有其它对象时,就得负责dealloc它们,通过重写dealloc函数。

1. 例子代码:
//1. AddressCard.h
#import <Foundation/NSObject.h>
#import <Foundation/NSString.h>


@interface AddressCard: NSObject {
    NSString *first;
    NSString *last;
    NSString *email;
}

-(AddressCard*) initWithFirst: (NSString*) f last: (NSString*) l email: (NSString*) e;
-(NSString*) first;
-(NSString*) last;
-(NSString*) email;
-(void) setFirst: (NSString*) f;
-(void) setLast: (NSString*) l;
-(void) setEmail: (NSString*) e;
-(void) setFirst: (NSString*) f last: (NSString*) l email: (NSString*) e;
-(void) setFirst: (NSString*) f last: (NSString*) l;
-(void) print;
@end


//2. AddressCard.m
#import "AddressCard.h"
#import <stdio.h>


@implementation AddressCard
-(AddressCard*) initWithFirst: (NSString*) f last: (NSString*) l email: (NSString*) e {
    self = [super init];


    if ( self ) {
        [self setFirst: f last: l email: e];
    }


    return self;
}


-(NSString*) first {
    return first;
}


-(NSString*) last {
    return last;
}


-(NSString*) email {
    return email;
}


-(void) setFirst: (NSString*) f {
    [f retain];
    [first release];
    first = f;
}


-(void) setLast: (NSString*) l {
    [l retain];
    [last release];
    last = l;
}


-(void) setEmail: (NSString*) e {
    [e retain];
    [email release];
    email = e;
}


-(void) setFirst: (NSString*) f last: (NSString*) l email: (NSString*) e {
    [self setFirst: f];
    [self setLast: l];
    [self setEmail: e];
}


-(void) setFirst: (NSString*) f last: (NSString*) l {
    [self setFirst: f];
    [self setLast: l];
}


-(void) print {
    printf( "%s %s <%s>", [first cString], [last cString], [email cString] );
}


-(void) dealloc {
    [first release];
    [last release];
    [email release];


    [super dealloc];
}
@end


//3. main.m
#import "AddressCard.h"
#import <Foundation/NSString.h>
#import <stdio.h>


int main( int argc, const char *argv[] ) {
    NSString *first =[[NSString alloc] initWithCString: "Tom"];
    NSString *last = [[NSString alloc] initWithCString: "Jones"];
    NSString *email = [[NSString alloc] initWithCString: "tom@jones.com"];
    AddressCard *tom = [[AddressCard alloc] initWithFirst: first last: last email: email];


    // we'return done with the strings, so we must dealloc them
    [first release];
    [last release];
    [email release];


    // print to show the retain count
    printf( "Retain count: %i\n", [[tom first] retainCount] );
    [tom print];
    printf( "\n" );
    
    // free memory
    [tom release];


    return 0;
}



2. 编译运行:
gcc -fconstant-string-class=NSConstantString -c main.m -I /GNUstep/System/Library/Headers
gcc -c AddressCard.m -I /GNUstep/System/Library/Headers
gcc main.o AddressCard.o  -o main -L /GNUstep/System/Library/Libraries/ -lobjc -lgnustep-base


$ ./main.exe
Retain count: 1
Tom Jones <tom@jones.com>
 
3. 说明:
  (1). 一定要先用retain保留一份引用计数,用完它之后,才能再调用release去使得引用计数减1; 

  (2). 这个实例展示了定义自己的类时,如果成员变量是其它对象的引用时,该如何处理。

4. 补充:

   关于更多的内存使用,回收的内容,可以参考下面给出的链网址来进一步学习和理解:

http://vinceyuan.cnblogs.com/



       
公文派2025:免费社区版重大安装更新! 距离上一次更新已经过去了将近一年的时间,今天我们带来了全新的免费2025社区版,该版本也是目前最新的版本,无需授权即可使用所有的功能。 阅读详情

相关推荐

【STM32Cube HAL】输入捕获(六)——脉宽测量

1

HAHAHA 4907

【Objective-C】OC中的Dealloc方法详解

今天来学习一下Dealloc方法的使用。 它的作用是,当对象的引用计数为0,系统会自动调用dealloc方法,回收内存。它的一般写法: 1:-(void)dealloc{ [super dealloc]; } 2:-(void)dealloc{ NSLog(@"laptop dead"); [_cpu release]; [...

weixin_34402408的博客 440

STM32F103中GPIO_Remap1_CAN1与GPIO_Remap2_CAN1的配置差异与应用场景解析

本文深入解析了STM32F103中GPIO_Remap1_CAN1与GPIO_Remap2_CAN1的配置差异与应用场景。通过剖析AFIO_MAPR寄存器,明确了两者在引脚映射(PB8/PB9 vs PD0/PD1)和适用封装上的区别,并提供了详细的配置步骤、常见陷阱排查及基于项目需求的选型指南,帮助开发者高效完成CAN引脚重映射。

u6v7w8x的博客 394

【ios】ARC中重写NSObject的dealloc方法的一个小细节

大家都知道ARC后是不能显示地调用dealloc方法,但是可以重载此方法。 突然考虑到如果父类有属性需要释放,而子类重写了此方法, 且重写子类dealloc时不能调用[super dealloc]会不会把父类的方法覆盖了 写了个测试类 @interface ClassA:NSObject @end @implementation ClassA -(void)dealloc

ashqal的专栏 1万+

海康H304NAS 刷机飞牛

本文旨在分享如何将闲置的海康威视H304 NAS刷入飞牛NAS系统,并利用iStoreOS作为安装媒介。之前因为使用极空间NAS,这台H304闲置已久。最近尝试了飞牛NAS,在虚拟机上安装后挂载极空间的电影资源,体验不错,于是决定重新折腾这台H304。我个人喜欢尝试新系统,之前经常更新H304的固件,但设备总在使用一两年后出现故障,需要联系技术清理日志才能恢复。最后一次设备“变砖”后,连技术人员也联系不上了,自己尝试修复未果,设备就此闲置两三年。

u012985257的博客 2745

模拟IC设计笔记:拆解一个经典的时钟占空比校正(DCC)电路模块,从理论到SPICE仿真

本文深入解析了时钟占空比校正(DCC)电路在模拟IC设计中的关键作用,特别是在高速ADC应用中。通过晶体管级拆解,详细介绍了基于电荷泵和积分器的模拟反馈型DCC电路设计,包括占空比检测、误差放大与校正执行单元的实现。文章还提供了SPICE仿真验证方法,确保电路在100MHz时钟下的稳定性和性能。

weixin_33725722的博客 424

Objective-C对象dealloc过程

Objective-C对象释放过程

零丁若叹 2441

ilqr算法原理推导及代码实践

ilqr算法原理详解

Forwarding3的博客 1741

Objective-C:dealloc、组合与聚合

1.dealloc方法1.1 用于释放malloc的空间 (会自动调用) .h文件#import <Foundation/Foundation.h>@interface CZExample : NSObject@end .m文件#import "CZExample.h"@implementation CZExample -(instancetype)init { if (self = [s

cz_zol的博客 365

LinuxCNC 源码解析:从界面开发到硬件交互的实战指南

本文深入解析LinuxCNC源码架构,从用户界面开发到硬件交互的实战指南。涵盖GTK与Tkinter界面开发、HAL硬件抽象层、G代码解析器改造及运动控制核心等关键模块,提供定制化开发技巧与性能优化方案,助力开发者高效掌握数控系统开发。

weixin_27066963的博客 190

FME入门系列教程3-带你玩转GIS数据搬运与处理

FME(Feature Manipulation Engine)就像GIS界的"瑞士军刀",它能轻松解决90%的数据处理难题。我最初接触FME是因为要处理200多个不同格式的CAD地形图,传统方法需要1周时间,用FME只花了2小时!:支持300+数据格式(Shapefile、GeoJSON、CAD、Excel等)添加Reader(数据源):选择示例数据roads.shp。添加Writer(输出):设置输出为GeoJSON格式。:将常用流程保存为Template(.fmwt)

weixin_41234946的博客 1242

Object-C Dealloc

上一篇为Object-C Init dealloc方法在一个对象从内存中删除时被调用。通常在这个方法里面释放所有对象里的实例变量 -(void)dealloc {   [super dealloc];   [caption release];   [photographer release]; }   在前两行,我们直接调用了实例变量的release方法。在这里我们不需要使用aut...

weixin_30426065的博客 124

RT-Thread littefs控制GD32F4xx片内Flash

GD32F4xx RT-Thread下使用littefs 控制片内flash 调试记录

madao1234的博客 995

从源码角度看苹果是如何实现 dealloc 的

大多数与生命周期有关的方法我们都已经讲完了,接下来来看最后一个方法,dealloc。 dealloc dealloc 方法的实现如下: // Replaced by NSZombies - (void)dealloc { _objc_rootDealloc(self); } void _objc_rootDealloc(id obj) { assert(obj); ob...

weixin_34203426的博客 208

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

iOS xcode14 Application circumvented Objective-C runtime dealloc initiation for <XXX> object

iOS16 Xcode14 适配

豪冷的博客 699

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

iOS dealloc的底层调用实现

#if LP64 static inline uint32_t ptr_hash(uint64_t key) { key ^= key >> 4; key *= 0x8a970be7488fda55; key ^= __builtin_bswap64(key); return (uint32_t)key; } #else static inline uint32_t ptr_hash(uint32_t key) { key ^= key >> 4; key *= 0x5052acdb

shiios的博客 538

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

iOS报错Application circumvented Objective-C runtime dealloc initiation for <xxx> object

改为 [super load];+(void)initialize 改为 +(void)load。运行一个比较旧的项目报这个错误,参考。

jjf19891208的专栏 746

iOS Runtime面试题(使用runtime Associate方法关联的对象,需要在主对象dealloc的时候释放么?)

使用runtime Associate方法关联的对象,需要在主对象dealloc的时候释放么? 无论在MRC下还是ARC下均不需要,被关联的对象在生命周期内要比对象本身释放的晚很多,它们会在被 NSObject -dealloc 调用的object_dispose()方法中释放。 详解: 1、调用 -release :引用计数变为零 对象正在被销毁,生命周期即将结束. 不能再有新的 __...

小丑鱼 1631

Object-C 构造函数 (init,initWithXXX) 析构函数(dealloc) initialize

在oc当中,构造函数主要以init,initWithXXXX来命名,主要负责初始化的相关工作 可以理解为用alloc创建一块在堆上的内存空间,这块空间我们要在使用之前做一些基本的初始化工作,初始化数据,和父类建立关系 析构函数dealloc,对象从内存中销毁前夕调用的函数 [objc] view plaincopyprint?

fool宋的专栏 1608

Dealloc 实现 原理

当对象的引用计数Wie0时, 系统会调用对象的dealloc方法释放 - (void)dealloc { _objc_rootDealloc(self); } 在内部 void _objc_rootDealloc(id obj) { assert(obj); obj->rootDealloc(); } 继续调用了rootDealloc方法 显然调用顺序...

xfy6238的博客 964

黑马程序员_object c学习日记③_SEL数据、内存管理一:引用计数器、retain、release、dealloc等

SEL类型数据:其实是对方法的一种包装 每个类的方法列表都存储在类对象中 每个方法都有一个与之对应的SEL类型的对象 根据一个SEL对象就可以找到方法地址,进而调用方法 [p test]; ①  把test包装成SEL类型数据; ②  根据SEL类型数据找到对应的方法地址; ③  根据方法地址调用相应的方法 [p performSelector:@selector(test)];

u014266774的专栏 792

OC对象的内存销毁步骤

General InformationWe take advantage of the documented Deallocation Timeline (WWDC 2011, Session 322, 36:22).1. -release to zero* Object is now deallocating and will die.* New __weak references are no...

Lea__DongYang的博客 1329

为什么你的Python服务RSS暴涨却无GC日志?——深入Objects/object.c与Modules/gcmodule.c,定位4类“静默内存泄漏”根源

快速定位Python服务RSS异常暴涨却无GC日志的真因!基于Python智能体内存管理策略源码分析,深入Objects/object.c与gcmodule.c,揭示循环引用、C扩展泄漏、弱引用误用、大对象池残留4类静默内存泄漏。适用于高并发服务调优,精准高效,值得收藏。

FastSolve的博客 366

release VS dealloc

由[obj alloc]分配的内存,可以有两种释放方式:[obj release]或者[obj dealloc]。其实release最终也是通过调用dealloc来释放内存,但release会判断要释放的内存是否正在被使用,如果没有被使用的话才执行释放。而且因为可以向nil object发送消息,所以下面的两种形式是等价的:if(obj) [obj release];[obj re

neverf4的专栏 315

[Objective C]super dealloc 调用时机

转自:http://dcm19872007.blog.163.com/blog/static/86519374201311953739818/ objective-c 语言中最头疼的事就是内存释放,申明一个变量后记得一定要释放这个变量,在我的iPhone开发笔记中已经有一些这方面的文章,今天在cocoaChina上看见一篇内存释放的帖子,说到我的心坎上了,因为这个问题也是我经常犯的,我们定义的全...

weixin_30369041的博客 88

[pop后不走dealloc 再push进来会走一次dealloc]问题记录

关于 NSTimer 和 NSRunLoop 的一些理解 https://www.cnblogs.com/shisishao/p/6564997.htmlIOS开发中NSRunloop跟NSTimer的问题 https://www.cnblogs.com/xwang/p/3547685.html+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)

iOSTianNan的博客 1564
上一篇: object-c的Retain and Release(保留与释放)
下一篇: android中binder的初始化
liranke
博客等级 码龄20年 4939粉丝 594原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liranke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值