首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

将对象设置为nil与在dealloc中发送释放消息之间的区别是什么

在Objective-C中,将对象设置为nil和在其dealloc方法中发送释放消息有明显的区别:

  1. 将对象设置为nil:这是一种对象引用,表明对象已经被释放,不应该再使用。将对象设置为nil后,可以通过nil值访问对象,但是这将导致未定义的行为,可能会导致程序崩溃或数据错误。
  2. 在dealloc方法中发送释放消息:这是一个对象在释放后发送的消息,表明对象已经被释放,不应该再使用。在dealloc方法中发送释放消息后,对象将不再可用,并且对象的内容将被释放。

总之,将对象设置为nil和在其dealloc方法中发送释放消息都是表明对象已经被释放,但是它们的使用方式和效果不同。通常情况下,建议使用dealloc方法来释放对象,以确保对象的内存被正确地管理,并且对象在被释放后不应该再被使用。如果需要确保对象在释放后仍然可用,可以使用nil值来引用对象,但是在这种情况下,需要谨慎处理对象的生命周期,以避免未定义的行为。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

精选面试题教你应对高级iOS开发面试官(提供底层进阶规划蓝图)

;他们之间可能进行赋值操作,确保对象字符串值不会无意间变动,应该在设置新属性值时拷贝一份。...不需要,ARC环境无论是强指针还是弱指针都无需 dealloc设置 nil,ARC 会自动帮我们处理,即便是编译器不帮我们做这些,weak也不需要在dealloc中置nil,runtime内部已经帮我们实现了...时 @protocol定义所有属性 category定义所有属性 重载属性,当在子类重载了父类属性,必须使用@synthesize来手动合成ivar objc向一个nil对象发送消息将会发生什么...objective-Cnil 发送消息是完全有效—只是在运行时不会有任何作用如果一个方法返回值是一个对象,那么发送nil消息返回o(nil),如果向一个nil对象发送消息,首先在寻找对象...objc向一个对象发送消息[obj foo]和objc_msgSend()函数之间有什么关系?

53900

2020-iOS最新面试题解析—1(原理篇)

,找到所有以akey weak 对象,从而设置 nil。...weak属性需要在dealloc中置nilARC环境无论是强指针还是弱指针都无需 dealloc 设置 nil , ARC 会自动帮我们处理 即便是编译器不帮我们做这些,weak也不需要在dealloc...Objective-Cnil发送消息是完全有效——只是在运行时不会有任何作用 如果一个方法返回值是一个对象,那么发送nil消息返回0(nil) 如果方法返回值指针类型,其指针大小小于或者等于...sizeof(void*) float,double,long double 或者long long整型标量,发送nil消息返回0 如果方法返回值结构体,发送nil消息返回0。...如果向一个nil对象发送消息,首先在寻找对象isa指针时就是0地址返回了,所以不会出现任何错误 objc向一个对象发送消息obj foo和objc_msgSend()函数之间有什么关系?

1.7K21
  • 2.24

    1.简述OC内存管理机制。retain配对使用方法是dealloc还是release,为什么?需要与alloc配对使用方法是dealloc还是release,为什么?...OC每个对象都对应着他引用计数,引用计数可以理解一个整数计数器,当使用alloc方法创建对象时,引用计数器会自动设置引用计数1,之后当你向对象发送retain消息时,引用计数+1,当你发送release...消息时,引用计数-1,当引用计数0时,�对象释放自己所占有的内存。...assign一样,weak指向内存区域被释放掉后,自动nil化,防止野指针泄露 2、类变量@protected、@private、@public、@package声明各有什么定义?...进程是什么?二者有什么区别和联系? 一个程序运行,至少有一个进程,一个进程内,至少有一个线程。 进程: 一个程序一个运行,执行过程拥有独立内存单元,而多个线程共享这个内存单元。

    47630

    iOS - 老生常谈内存管理(二):从 MRC 说起

    Objective-C中允许给nil发送消息,且这样会直接返回不做任何事情。所以就算是第一次调用,_count 变量nil,对其进行 release也没事。...备注: 先解释一下nil和release作用:nil一个对象指针置空,只是切断了指针和内存对象联系,并没有释放对象内存;而release才是真正释放对象内存操作。...集合dealloc方法,应该向集合中所有剩余对象发送一条release消息。...创建对象时,其retain count 1。 向对象发送retain消息时,其retain count +1。 向对象发送release消息时,其retain count -1。...@autoreleasepool之后,你应该任何autorelease对象视为 “已销毁”。不要向该对象发送消息或将其返回给你方法调用者。

    1.6K21

    OC-基础总结(二)

    对象发送1条retain消息对象引用计数器就会加1,当多1个人使用对象时候才发。 2). 对象发送1条release消息对象引用计数器就会减1,当少1个人使用对象时候才发。...对象发送1条retainCount消息,就可以取到对象引用计数器值。 4). 对象引用计数器变为0时候,对象就会被系统立即回收,在对象被回收时候,会自动调用对象dealloc方法。...当1个指针称为野指针以后,这个指针设置nil。....m文件再#import对方头文件即可。 区别 1). #import是指定文件内容拷贝到写指令地方。 2)....ARC机制下,当对象被回收时候,原来指向这个对象弱指针会被自动设置nil

    959100

    iOS BAT面试对答题

    objc向一个对象发送消息时,runtime会根据对象isa指针找到该对象实际所属类,然后该类方法列表以及其父类方法列表寻找方法运行,如果一直到根类还没找到,转向拦截调用,走消息转发机制,...3.objc向一个nil对象发送消息将会发生什么? 如果向一个nil对象发送消息,首先在寻找对象isa指针时就是0地址返回了,所以不会出现任何错误。也不会崩溃。...4.objc向一个对象发送消息[obj foo]和objc_msgSend()函数之间有什么关系?...objc向一个对象发送消息时,runtime库会根据对象isa指针找到该对象实际所属类,然后该类方法列表以及其父类方法列表寻找方法运行,如果,最顶层父类依然找不到相应方法时,会进入消息转发阶段...weak 对象,从而设置 nil

    94200

    浅析 NSTimer 和 CADisplayLink 内存泄漏

    我们开启了一个新线程,并且 CADisplayLink 对象添加到这个子线程 RunLoop ,然后主线程更新UI即可。...如果对 timer 对象发送一个 invalidate 消息,这样 NSRunLoop 即不会对 timer 进行强引,同时 timer 也会释放对 myClock 对象强引,这样不就解决了吗?...开发我们可能会遇到某些需求,只有 myClock 对象要被释放时才去释放 timer(此处要注意释放先后顺序及释放条件),如果提前向 timer 发送了 invalidate 消息,那么 myClock...所以我们要做向 myClock 对象发送 dealloc 消息前在给 timer 发送 invalidate 消息,从而避免本末倒置问题。...(image-527020-1528529178817)] 为了解决 timer myClock 之间类似死锁问题,我们会将定时器 target 对象替换成定时器自己,采用分类实现。

    1.6K10

    面经之《招聘一个靠谱iOS》import CYLBlockExecutor.himport CYLBlockExecutor.himport CYLNSObject+RunAtDeallo

    这种属性设置新值时,设置方法既不保留新值,也不释放旧值。此特质同assign类似, 然而在属性所指对象遭到摧毁时,属性值也会清空(nil out)。...b非nil时,a和b指向同一个内存地址,b变nil时,a变nil。此时向a发送消息不会崩溃:Objective-Cnil发送消息是安全。... Objective-C nil 发送消息是完全有效——只是在运行时不会有任何作用: 如果一个方法返回值是一个对象,那么发送nil消息返回0(nil)。...例如: Person * motherInlaw = [[aPerson spouse] mother]; 如果 spouse 对象 nil,那么发送nil 消息 mother 也返回 nil...如果方法返回值结构体,发送nil 消息返回0。结构体各个字段都是0。 如果方法返回值不是上述提到几种情况,那么发送nil 消息返回值将是未定义

    1K100

    《Objective C编程》笔记

    可以main()返回结果视为“粗欧文报告”,这样0就是好消息,没有错误就是成功。 2.消息消息发送(指令)必须写在一对括号,并且必须包含以下两个部分。 指针,指向接收消息对象。...18.Objective-C,有三种途径可以实现回调。 a.目标-动作(Target-action):应用开始等待前,要求“当X发生时,向指定对象发送某个特定消息。”...当其中某个通告出现时,向指定对象发送特定消息。 19.选择器:当某个对象收到消息,会向该对象类进行查询,检查是否有之匹配方法。因此该方法必须非常快速。...如果某个对象注册观察器,那么通常应该在释放对象时,将其移出通告中心。...如果该对象释放,那么相应实例变量就会被自动赋nil(如果在声明指针变量时,使用是unsafe_unretain特性,那么当其指向对象释放后,该指针变为悬空指针。

    60530

    OC知识--彻底理解内存管理(MRC、ARC)

    引用计数器操作 保证对象存在,每当创建引用到对象需要给对象发送一条retain消息,可以使引用计数器值+1 ( retain 方法返回对象本身) 当不再需要对象时,通过给对象发送一条release消息...,可以使引用计数器值-1 给对象发送retainCount消息,可以获得当前引用计数器值 当对象引用计数0时,系统就知道这个对象不再需要使用了,所以可以释放内存,通过给对象发送dealloc消息发起这个过程...方法 当一个对象引用计数器值0时,这个对象即将被销毁,其占用内存被系统回收 对象即将被销毁时系统会自动给对象发送一条dealloc消息(因此,从dealloc方法有没有被调用,就可以判断出对象是否被销毁...[p release]; } return 0; } 为了避免给野指针发送消息会报错,一般情况下,当一个对象释放后我们会将这个对象指针设置空指针 空指针 没有指向存储空间指针...图片3.png 当执行完第4行代码p.room = r;时,因为调用了setter方法,Room实例对象赋值给了Person成员变量,不做其他设置的话,在内存表现如下图(做法不对): ?

    4.5K80

    iOS 开发:彻底理解 iOS 内存管理(MRC 篇)

    对象引用计数 0 时,系统就知道这个对象不再需要使用了,所以可以释放内存,通过给对象发送 dealloc 消息发起这个过程。...对象即将被销毁时系统会自动给对象发送一条 dealloc 消息(因此,从 dealloc 方法有没有被调用,就可以判断出对象是否被销毁) dealloc 方法重写(注意是 MRC ) 一般会重写...[p release]; // 报错 } return 0; } 为了避免给野指针发送消息会报错,一般情况下,当一个对象释放后我们会将这个对象指针设置空指针。...3.5.2 多个对象内存管理思想 多个对象之间往往是通过 setter 方法产生联系,其内存管理方法也是 setter 方法、dealloc 方法实现。...,不做其他设置的话,在内存表现如下图(做法不对): image 调用 setter 方法时候,因为 Room 实例对象多了一个 Person 对象引用,所以应将 Room 实例对象引用计数

    1.3K20

    iOS理论基础(二)

    这种属性设置新值时,设置方法既不保留新值,也不释放旧值。此特质同 assign 类似, 然而在属性所指对象遭到摧毁时,属性值也会清空(nil out)。...weak 对象,从而设置 nil。...ARC环境无论是强指针还是弱指针都无需 dealloc 设置 nil , ARC 会自动帮我们处理 即便是编译器不帮我们做这些,weak也不需要在 dealloc 中置nil: 6.... Objective-C nil 发送消息是完全有效——只是在运行时不会有任何作用: 如果一个方法返回值是一个对象,那么发送nil消息返回0(nil)。...如果方法返回值结构体,发送nil 消息返回0。结构体各个字段都是0。 2. 如果方法返回值不是上述提到几种情况,那么发送nil 消息返回值将是未定义

    42510

    iOS 内存管理相关面试题

    指向对象强指针是否被销毁 引用计数器 给对象发送一条retain消息,可以使引用计数器+1(retain方法返回对象本身) 给对象发送一条release消息,可以使引用计数器-1(注意release并不代表销毁...答:多次地址存到自动释放池中,导致野指针异常 2.6 自动释放池作用 将对象自动释放池建立关系,池子内调用 autorelease 方法,自动释放池销毁时销毁对象,延迟 release 销毁时间...weak weak 所引用对象计数器不会加一,当对象释放时指针会被自动赋值 nil,系统会立刻释放对象。...通常在调用完release方法后,会把保存了对象指针地址变量清空,赋值nil oc没有空指针异常,所以使用[nil retain]调用方法不会导致异常发生 内存泄漏有几种情况?...没有配对释放,不符合内存管理原则 对象提前赋值nil或者清空,导致release方法没有起作用 5.2 多个对象内存管理问题 对象对象之间存在几种关系?

    1.5K30

    Objective-C 内存管理之 _ARC

    也就是说,_weak不会影响对象销毁,仅仅要__weak 修饰对象没有强引用时,就会自己主动销毁,这时候_ weak 变量会自己主动设置nil....(id)autorelease;// 是 NSObject提供方法,此方法某一个预定时候,想对象发送 release 消息,返回值是接收消息对象.实际上当给一个对象发送 autorelease...消息时候,就是这个对象加入到自己主动释放池( NSAutoreleasePool) ,当自己主动释放池被销毁时,会向该池中全部对象发送 release 消息 暂时对象和拥有对象 当使用如:arrayWithCapacity...假设在你自己定义依赖其他对象时,你须要重写dealloc方法。而且在这种方法释放依赖对象 假设在设计循环体中会占用较多内存空间。建议手动创建自己主动释放池。...假设你须要管理资源而不是释放实例变量,你应该事先 dealloc 方法.不能再 dealloc 方法里面去调[ super dealloc] 方法, ARC下父类 dealloc 相同由编译器来自己主动完毕

    57210

    iOS-底层原理36:内存优化(一) 野指针探测

    Bugly工程师:陈其锋分享,在其代码主要思路是 1、通过fishhook替换C函数free方法自定义safe_free,类似于Method Swizzling 2、safe_free方法对已经释放变量内存...可以用来检测内存错误(EXC_BAD_ACCESS),它可以捕获任何阐释访问坏内存调用 给僵尸对象发送消息的话,它仍然是可以响应,然后会发生崩溃,并输出错误日志来显示野指针对象调用类名和方法 苹果僵尸对象检测原理...1、开启野指针检测 2、设置监控到野指针时回调block,block打印信息,或者存储堆栈 3、检测到野指针是否crash 4、最大内存占用空间 5、是否记录dealloc调用栈 6、监控策略...方法自定义dealloc方法 2、为了避免内存空间释放后被重写造成野指针问题,通过字典存储被释放对象,同时设置30s后调用dealloc方法字典存储对象释放,避免内存增大 3、为了获取更多崩溃信息...((MIZombieProxy *)obj).originClass = currentClass; //设置30s后调用dealloc存储对象释放,避免内存空间增大

    2.2K31

    备战九十,iOS面试题菜单,持续更新(题目及答案已上传Github)

    runtime (戳这里跳转到Github) objc向一个对象发送消息时,发生了什么? objc向一个nil对象发送消息将会发生什么?...objc向一个对象发送消息obj foo和objc_msgSend()函数之间有什么关系? 什么时候会报unrecognized selector异常? 能否向编译后得到增加实例变量?...isKindOfClass isMemberOfClass 使用runtime Associate方法关联对象,需要在主对象dealloc时候释放么?...如何运用 Runtime 进行模型归解档 Obj-C 为什么叫发消息而不叫函数调用? 分类和类拓展区别? 说一下 Runtime 方法缓存?存储形式、数据结构以及查找过程?...函数返回一个对象时,会对对象 autorelease 么?为什么? 说一下什么是 悬垂指针?什么是 野指针? 内存管理默认关键字是什么? 内存5大区分别是什么

    1.3K00

    iOS - 老生常谈内存管理:导读

    MRC 下什么时候需要给对象发送 release 消息?什么时候使用 autorelease? 为什么不要在初始化方法和 dealloc 中使用访问器方法?...weak 变量在对象被销毁后是如何置 nil ,Runtime 是怎样实现它? Runtime weak 变量赋值过程?...释放 NSAutoreleasePool 对象,使用 [pool release] [pool drain] 区别? @autoreleasepool 你了解多少?...ARC 环境下,autorelease 对象什么时候释放? ARC 环境下,需不需要手动添加 @autoreleasepool? Tagged Pointer 是什么?...阅读注意 避免语义混淆,所有文章释放” 一词均指release,“销毁” 一词均指dealloc。 如果您在阅读中发现任何错误,欢迎指出。 总结不易,点个关注吧!

    63010

    iOS_理解“属性”(property)这一概念

    ,OC给nil发送消息是不会报错。...会报Error❗️,这些修饰符只能用来修饰“对象类型”(object type)。 weak和assign区别? ​ assign变量指向变量释放后不会置nil,再使用会crash。...而weak会置nil。 weak和strong区别? ​ 当一个对象还有strong类型指针指向时,不会被释放。若仅有weak类型指针指向时,会被释放。...当实例对象存在weak指针指向自己时,系统会为这个实例创建一个子类,这个实例isa指正指向子类,然后重写dealloc方法,dealloc方法添加清除weak指针操作(以当前对象内存地址key...__unsafe_unretained:该引用不对对象保持强引用,并在对象释放后不会置nil, 从而成为一个野指针,所以是unsafe __autorelease:用于表示通过引用(id *)传递并在返回时自动释放参数

    60120

    iOS应用开发:什么是ARC

    B:代码判断是否支持arc,包括对属性(property)、释放(release)判断。   dealloc需要这样做: 类如果注册了通知(观察者模式),需要remove掉。...这个时候,可以项目编译设置“Objectice-C Auto Reference Counteting”设为NO。如下所示。 ?...__unsafe_unretained 该关键字__weak一样,也是弱参照,__weak区别只是是否执行nil赋值(Zeroing)。...但是这样,需要注意变量所指对象已经被破弃了,地址还还存在,但内存对象已经没有了。如果还是访问该对象引起「BAD_ACCESS」错误。 __autoreleasing 该关键字使对像延迟释放。...weak 该属性对应 __weak 关键字, __weak 定义变量一致,该属性所声明变量没有对象所有权,并且当对象被破弃之后,对象将被自动赋值nil

    1.1K60

    《Effective Objective-C》干货三部曲(二):规范篇

    第18条:尽量使用不可变对象 书中作者建议尽量把对外公布出来属性设置只读,实现文件内部设为读写。具体做法是: 头文件设置对象属性readonly,实现文件设置readwrite。...第23条:通过委托数据源协议进行对象间通信 如果给委托对象发送消息,那么必须提前判断该委托对象是否实现了该消息: NSData *data = /* data obtained from network...,对象数目设置100,开销值设置5MB。...一旦外界指向EOC类最后一个引用消失,该类就会被释放,被释放同时,也会向NSTimer发送invalidate消息(因为该类dealloc方法向NSTimer发送了invalidate消息)。...而且,即使dealloc方法里没有发送invalidate消息,因为块里weakSelf会变成nil,所以NSTimer同样会失效。

    81910
    领券