首页
学习
活动
专区
工具
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.5K21
  • 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

    为什么不能在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.1K40

    老司机读书笔记——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.以自动释放池降低内存峰值 比方说,循环中不断地创建的临时对象。即便这些对象调用完方法之后就就不在使用了,他们也依然处于存活状态,因为目前还在自动释放池里,等待系统稍后将其释放并回收。

    46520

    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

    56510

    《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之前插入函数详细实现逻辑。

    60130

    精选面试题教你应对高级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 的机制来决定对象是否需要释放

    53300

    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 的区别

    57410

    一份走心的iOS开发规范

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

    11.9K145

    面经之《招聘一个靠谱的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) 继承关系中每一层的

    997100

    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.

    93500

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

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

    78220

    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内存管理-基本概念整理

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

    1.1K31

    回顾retain,copy,assign

    拷贝之前,都会释放旧的对象。...此时a和b指向同一块内存,请问当a不再需要这块内存,能否直接释放它?答案是否定的,因为a并不知道b是否还在使用这块内存,如果a释放了,那么b使用这块内存的时候会引起程序crash掉。...原子操作就是指具有原子性的操作)objective-c 属性设置里面默认的就是atomic,意思就是setter/getter函数是一个原子操作,如果多线程同时调用setter时,不会出现某一个线程执行完...objective-c里面通常对象类型都应该声明为非原子性的. iOS中程序启动的时候系统只会自动生成一个单一的主线程.程序执行的时候一般情况下是同一个线程里面对一个属性进行操作....如果在程序中我们确定某一个属性会在多线程中被使用,并且需要做数据同步,就必须设置成原子性的,但也可以设置成非原子性的,然后自己程序中用加锁之类的来做数据同步.通常说nonatomic 是提高非多线程应用中的读写效率

    75680
    领券