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

Objective-C:在释放父对象之前,是否必须dealloc属性对象?

在Objective-C中,当一个对象被释放时,它的属性对象会自动被释放。因此,在释放父对象之前,不必手动调用dealloc方法释放属性对象。

Objective-C使用引用计数(reference counting)来管理内存,每个对象都有一个引用计数器。当一个对象的引用计数器变为0时,系统会自动释放该对象。当一个对象被释放时,它所持有的所有属性对象也会被自动释放。

在Objective-C中,我们通常会在dealloc方法中释放其他资源,比如打开的文件、网络连接等。在dealloc方法中,可以手动调用属性对象的release方法来减少引用计数,但这并不是必须的,因为当父对象被释放时,属性对象会自动被释放。

需要注意的是,在使用ARC(Automatic Reference Counting)自动内存管理的情况下,我们不需要手动编写dealloc方法。ARC会在适当的时机自动插入内存管理代码,包括释放对象和清理属性对象。

总结起来,不必在释放父对象之前手动调用dealloc方法释放属性对象,因为在Objective-C中,属性对象会在父对象被释放时自动被释放。

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

相关·内容

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

但是如果你在方法中使用release,则return之前就会销毁 NSString 对象,该方法将返回无效对象。...使用autorelease,就会延迟release,在 NSString 对象被释放之前返回。...使用访问器方法让内存管理更轻松 如果类中有对象类型的属性,则你必须确保在使用过程中该属性赋值的对象不被释放。因此,在赋值对象时,你必须持有对象的所有权,让其引用计数加 1。...而此时只是在进行父类的初始化,子类初始化还未完成,所以可能会发生错误。 在销毁子类对象时,首先是调用子类的dealloc,最后调用[super dealloc](这与init相反)。...在《Effective Objective-C 2.0 编写高质量iOS与OS X代码的52个有效方法》书中的第 31 条 —— 在 dealloc 方法中只释放引用并解除监听 一文中也提到:在 dealloc

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

    class_replaceProperty 是否可以把比较耗时的操作放在NSNotificationCenter中 首先必须明确通知在哪个线程中发出,那么处理接受到通知的方法也在这个线程中调用 如果在异步线程发的通知...weak属性需要在dealloc中置nil么 在ARC环境无论是强指针还是弱指针都无需在 dealloc 设置为 nil , ARC 会自动帮我们处理 即便是编译器不帮我们做这些,weak也不需要在dealloc...,指向他的类对象,类对象中存放着本对象的如下信息 对象方法列表 成员变量的列表 属性列表 每个 Objective-C 对象都有相同的结构,如下图所示 | Objective-C 对象的结构图 | |...无论在MRC下还是ARC下均不需要 被关联的对象在生命周期内要比对象本身释放的晚很多,它们会在被 NSObject -dealloc 调用的 object_dispose()方法中释放 补充:对象的内存销毁时间表...父类调用 -dealloc * 继承关系中最直接继承的父类再调用 -dealloc * 如果是 MRC 代码 则会手动释放实例变量们(iVars) * 继承关系中每一层的父类 都再调用 -dealloc

    1.7K21

    老司机读书笔记——Effective Objective-C 2.0阅读笔记

    Effective Objective-C 2.0阅读笔记 这篇文章你将看到以下内容: Efficetive Objective-C 2.0阅读笔记一些有价值的建议 ---- 1.对象内部尽量直接访问实例变量...访问实例变量不会触发KVO -init及-dealloc方法中应使用实例变量 对象内部应尽量遵守如下原则:取值采用实例变量,赋值采用属性。 ---- 2.消息转发机制流程 ?...---- 5.在-dealloc中只释放引用并解除监听 在-dealloc方法里,应该做的事情就是释放指向其他对象的引用,并取消原来订阅的“键值观测”(KVO)或NSNotificationCenter...如果对象持有文件描述符等系统资源,那么应该专门编写一个方法来释放此种资源。这样的类要和其他使用者约定:用完资源后必须调用close方法。...---- 6.以自动释放池降低内存峰值 比方说,在循环中不断地创建的临时对象。即便这些对象在调用完方法之后就就不在使用了,他们也依然处于存活状态,因为目前还在自动释放池里,等待系统稍后将其释放并回收。

    47220

    Objective-C 内存管理之 _ARC

    _strong 属性基本上能适应 ARC 环境下的全部情况.假设不写的话,默觉得_ strong 属性. (2) __weak 不持有对象,仅仅是简单地引用而已....可是你须要在对象属性上使用weak 和strong, 当中strong就相当于retain属性,而weak相当于assign。基础类型还是使用assign。...假设在你自己定义的类中依赖其他对象时,你须要重写dealloc方法。而且在这种方法中释放依赖的对象 假设在设计的循环体中会占用较多的内存空间。建议手动创建自己主动释放池。...假设你须要管理资源而不是释放实例变量,你应该事先 dealloc 方法.不能再 dealloc 方法里面去调[ super dealloc] 方法,在 ARC下父类的 dealloc 相同由编译器来自己主动完毕...不能在 C 结构中使用对象指针,假设有相似功能,能够创建一个 Objective-C 类来管理这些对象 在 id和 void * 之间没有简便的转换方法,相同在Objective-C 和 Core Foundation

    57910

    为什么不能在init和dealloc函数中使用accessor方法

    为什么不能在dealloc中调用accessor 还是基于子类重写了父类的value属性这一前提,在子类对象销毁时,首先调用子类的dealloc,最后调用父类的dealloc(这与init初始化方法是相反的...但此时子类已经释放(因为先调用子类的dealloc,后调用父类的dealloc),所以就会出现错误甚至崩溃。...{ _debugInfo = nil; } @end 在SubClass的实例对象销毁时,首先调用子类的dealloc,再调用父类的dealloc(这与init初始化是相反的,且ARC中不需要我们手动调用...另外,在《Effective Objective-C 2.0 编写高质量iOS与OS X代码的52个有效方法》的第31条——在dealloc方法中只释放引用并解除监听一节文中,作者也提到了下面一段话:...不过,有些情况我们必须破例,必须访问accessor,比如:待初始化的实例变量声明在超类中,而我们又无法在子类中访问此实例变量的话,那么我们只能通过setter来对实例变量赋值。

    9.2K40

    《Objective C编程》笔记

    5.合并存取属性的便捷方法: 在.h中国,通过@property声明属性,如 @property int w; 在impl中,要求编译器根据@property声明自动合成(synthesize)出存取方法...只能向NSSet对象查询某个对象是否存在,它有一个名为containObject:的方法。 14.在Apple提供的类中,有些覆盖了isEqual:方法。...#define告诉预处理器:在编译器看到A之前,使用B替换之。 18.在Objective-C中,有三种途径可以实现回调。...当其中某个通告出现时,向指定的对象发送特定的消息。 19.选择器:当某个对象收到消息,会向该对象的类进行查询,检查是否有与之匹配的方法。因此该方法必须非常快速。...26.c语言辅助函数,由于不属于函数内任何一部分,故应该在.h中位于@interfce之前,在.m中应该位于import之后,@implement之前插入函数详细实现逻辑。

    60930

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

    时 在@protocol中定义的所有属性 在category中定义的所有属性 重载的属性,当在子类中重载了父类中的属性,必须使用@synthesize来手动合成ivar objc中向一个nil对象发送消息将会发生什么...在objective-C中向nil 发送消息是完全有效的—只是在运行时不会有任何作用如果一个方法返回值是一个对象,那么发送给nil的消息将返回o(nil),如果向一个nil对象发送消息,首先在寻找对象的...✍ 万水千山总是情,点赞收藏行不行,还望各位大侠多多支持❤️ 使用runtime Associate方法关联的对象,需要在主对象dealloc的时候释放么? 无论在MRC下还是ARc下均不需要。...*调用[ self dealloc] 2.子类调用-dealloc 继承关系中最底层的子类在调用-dealloc 如果是MRC代码则会手动释放实例变量们(ivars)*继承关系中每一层的父类都在调用-...通过retaincount 的机制来决定对象是否需要释放。

    55100

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

    此外,__weak 会消耗一定的性能,使用 __weak 需要检查对象是否被释放,在追踪是否被释放的时候需要追踪一些信息,则使用 __unsafe_unretained 比 __weak 快,消耗 CPU...对象的生成/持有的方法必须遵循以下命名规则:alloc / new / copy / mutableCopy / init。 不能显式调用 dealloc。...重写父类的 dealloc 方法时,不能再调用 [super dealloc];。 使用 @autorelease 块代替 NSAutoreleasePool。 5....ARC 下多对象内存管理 ARC 和 MRC 一样, 想拥有某个对象必须用强指针保存对象, 但是不需要在 dealloc 方法中调用 release。...博文】《Objective-C 高级编程》干货三部曲(一):引用计数篇 【博文】Objective-C 属性修饰符 strong 和 copy 的区别 【博文】iOS strong 和 copy 的区别

    61510

    一份走心的iOS开发规范

    问题就是:当你从Cocoa framework(即Cocoa系统库)中的某个类派生出来一个子类时,你并不知道你的子类中定义的私有方法是否覆盖了父类的私有方法,即有可能你自己在子类中实现的私有方法和父类中的某个私有方法同名...【必须】调用父类的designated初始化方法初始化本类的对象。 【必须】校验父类designated初始化方法返回的对象是否为nil。...【必须】在dealloc方法中,禁止将self作为参数传递出去,如果self被retain住,到下个runloop周期再释放,则会造成多次释放crash。...} 【必须】和init方法一样,禁止在dealloc方法中使用self.xxx的方式访问属性。如果存在继承的情况下,很有可能导致崩溃。...【必须】在dealloc方法中,禁止将self作为参数传递出去,如果self被retain住,到下个runloop周期再释放,则会造成多次释放crash。这一点在dealloc一节中有说明。

    12.1K145

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

    ( 在本例中,之所以还要声明属性的“内存管理语义”--copy,是因为:如果不写 copy,该类的调用者就不知道初始化方法里会拷贝这些属性,他们有可能会在调用初始化方法之前自行拷贝属性值。...(注:在下文的《使用runtime Associate方法关联的对象,需要在主对象dealloc的时候释放么?》里给出的“对象的内存销毁时间表”也提到__weak引用的解除时间。)...重载的属性 当你在子类中重载了父类中的属性,你必须 使用 @synthesize 来手动合成ivar。...使用runtime Associate方法关联的对象,需要在主对象dealloc的时候释放么? 在ARC下不需要。 在MRC中,对于使用retain或copy策略的需要 。...调用 [self dealloc] 父类 调用 -dealloc 继承关系中最底层的父类 在调用 -dealloc 如果是 MRC 代码 则会手动释放实例变量们(iVars) 继承关系中每一层的父类

    1K100

    iOS BAT面试对答题

    objc在向一个对象发送消息时,runtime库会根据对象的isa指针找到该对象实际所属的类,然后在该类中的方法列表以及其父类方法列表中寻找方法运行,如果,在最顶层的父类中依然找不到相应的方法时,会进入消息转发阶段...但是的在调用 objc_allocateClassPair 之后,objc_registerClassPair 之前,原因同上. 7.给类添加一个属性后,在类结构体里哪些元素会发生变化?...SideTable结构体是负责管理类的引用计数表和weak表, 12.使用runtime Associate方法关联的对象,需要在主对象dealloc的时候释放么?...无论在MRC下还是ARC下均不需要,被关联的对象在生命周期内要比对象本身释放的晚很多,它们会在被 NSObject -dealloc 调用的object_dispose()方法中释放。...**父类调用 -dealloc 继承关系中最直接继承的父类再调用 -dealloc 如果是 MRC 代码 则会手动释放实例变量们(iVars)继承关系中每一层的父类 都再调用 -dealloc **3.

    94600

    Objective-C 内存管理(上)学习笔记

    MRC是基于引用计数的内存管理,是否释放内存取决于引用计数是否为0;但注意,真正要研究并不是引用计数,而是对象是否被持有的问题。...ARC是基于自动引用计数的内存管理,是否释放内存取决于对象是否还有强引用指向;真正研究的是,对象的所有权问题。...MRC使用的管理内存的基本方法和属性: 四个方法 --> retain/release/dealloc/autorelease/ 一个属性 --> retainCount(记录引用计数值) 对象 +1 release 释放对象 -1 dealloc 销毁对象 此时该值没有意义 autorelease 在自动释放池结束时,为里面的对象发送一条release消息 (all object...内存泄漏 我们知道对象在最后销毁的时候是调用了dealloc方法的,那么girl既然持有了apple那么在销毁自己的时候是不是应该把自己持有的东西给交出来(释放掉),已死的对象不可能持有东西了吧,所以在

    80120

    iOS内存管理-基本概念整理

    4.非自己持有的对象无法释放 在应用程序中释放非自己持有的对象就会造成崩溃,使用代码演示如下: //情况1:释放完不再需要的对象后再次释放,访问了已经废弃的对象而崩溃!...__unsafe_unretained可用于iOS5之前版本,为兼容ARC弱引用而引入; __autoreleasing修饰符: 将对象赋值给附有__autoreleasing修饰符的变量, 等同于在...,实际上必定要访问注册到autoreleasepool的对象; id的指针或对象的指针在没有显式地指定修饰符时候,会被默认附加上__autoreleasing修饰符; 4.ARC属性修饰符 ARC中的所有权修饰与属性修饰符存在着对应关系...以这些名称开始的方法在返回对象时,必须返回给调用方所应当持有的对象。这在ARC环境下的规则一样。...但是为了在ARC也能实现对Core Foundation对象的自动内存管理,我们就必须将其与Objective-C对象的转换。

    1.1K31

    property属性相关小记

    用于调用属性时可以知道该属性是否可能为nil,并针对处理。...Objective-C对象所占内存总是分配在“堆空间”,且堆内存由开发者释放,即release; 由编译器管理自动释放的,在方法中定义的变量通常在栈内。...因为他总是在超出他的作用域时被自动销毁了 在objective-c中只支持一个类型对象:block 堆区(heap):一般由程序员分配释放,若程序员不释放,则可能会引起内存泄漏。...weak属性需要在dealloc中置nil么?(runtime如何实现weak变量自动置nil) 不需要。在释放时,调用clearDeallocating函数。...(1)、调⽤用objc_release (2)、因为对象的引⽤用计数为0,所以执行dealloc (3)、在dealloc中,调⽤用了了_objc_rootDealloc函数 (4)、在_objc_rootDealloc

    1.1K20

    iOS面试题梳理(二)

    因为使用 KVC 键值编码,它必须先解析字符串,然后在设置或者访问对象的实例变量。 键值观察(KVO): 1.键值观察机制是一种能使得对象获取到其他对象属性变化的通知 ,极大的简化了代码。...在 Objective-C 中如何实现 KVO 1.注册观察者(注意:观察者和被观察者不会被保留也不会被释放) - (void)addObserver:(NSObject *)observer forKeyPath...当我们释放我们的对象时,为什么需要调用[super dealloc]方法,它的位置又是如何的呢因为子类的某些实例是继承自父类的,因此需要调用[super dealloc]方法, 来释放父类拥有的实例,其实也就是子类本身的...一般来说我们优先释放子类拥 有的实例,最后释放父类所拥有的实例。...4.管理undo/redo操纵; 5.检查托管对象的属性值是否正确。

    1.2K101
    领券