首页
学习
活动
专区
工具
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-C中向nil 发送消息是完全有效的—只是在运行时不会有任何作用如果一个方法返回值是一个对象,那么发送给nil的消息将返回o(nil),如果向一个nil对象发送消息,首先在寻找对象的...objc中向一个对象发送消息[obj foo]和objc_msgSend()函数之间有什么关系?

55100

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

,找到所有以a为key的 weak 对象,从而设置为 nil。...weak属性需要在dealloc中置nil么 在ARC环境无论是强指针还是弱指针都无需在 dealloc 设置为 nil , ARC 会自动帮我们处理 即便是编译器不帮我们做这些,weak也不需要在dealloc...在Objective-C中向nil发送消息是完全有效的——只是在运行时不会有任何作用 如果一个方法返回值是一个对象,那么发送给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的声明各有什么定义?...进程是什么?二者有什么区别和联系? 一个程序运行,至少有一个进程,一个进程内,至少有一个线程。 进程: 一个程序的一个运行,在执行过程中拥有独立的内存单元,而多个线程共享这个内存单元。

    48430

    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。

    962100

    iOS BAT面试对答题

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

    94600

    浅析 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-C中向nil发送消息是安全的。...在 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特性,那么当其指向的对象被释放后,该指针变为悬空指针。

    60930

    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.6K80

    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.4K20

    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 的消息的返回值将是未定义的。

    43710

    iOS 内存管理相关面试题

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

    1.6K30

    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.3K31

    Objective-C 内存管理之 _ARC

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

    57910

    备战九十,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_理解“属性”(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 *)传递并在返回时自动释放的参数

    61720

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

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

    63710

    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同样会失效。

    82610
    领券