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

为什么我们使用[super dealloc]而不是[self dealloc]或[object dealloc]

在Objective-C中,我们使用[super dealloc]而不是[self dealloc][object dealloc]是因为dealloc方法是一个特殊的方法,它需要在继承链中正确地传播。

首先,我们使用[super dealloc]而不是[self dealloc]是因为dealloc方法是一个特殊的方法,它需要在继承链中正确地传播。[super dealloc]会调用父类的dealloc方法,这样可以确保父类的资源也被正确地释放。如果我们使用[self dealloc],那么我们将会陷入无限递归,因为我们在调用自己的dealloc方法。

其次,我们使用[super dealloc]而不是[object dealloc]是因为dealloc方法是一个特殊的方法,它需要在继承链中正确地传播。[super dealloc]会调用父类的dealloc方法,这样可以确保父类的资源也被正确地释放。如果我们使用[object dealloc],那么我们将会释放object对象的资源,但是我们并没有保证object对象的父类资源也被正确地释放。

总之,我们使用[super dealloc]而不是[self dealloc][object dealloc]是因为dealloc方法是一个特殊的方法,它需要在继承链中正确地传播,以确保所有的资源都被正确地释放。

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

相关·内容

ARC 环境下 dealloc 的使用误区

在MRC时代,我们需要在 dealloc中做很多,比如释放对象,如今我们已经进入ARC时代,对于普通对象的释放,系统已经帮我们做好了;是不是我们就再也不用担心内存问题了呢?答案是否定的 。...//调用方法 -(void)dealloc{ // [super dealloc]; //ARC环境下不需要调用。因为系统会 自动调用该方法帮助释放父类对象。...二.dealloc 误区 我们在开发过程中,用到dealloc,却因不会意识得到对象的引用计数是不是为0,dealloc到底走了没走,因而导致内存暴增,还会遇到很多奇怪的问题。...]; } 一直相信没错啊,在dealloc的打断点才发现该方法却没有走,为什么呢?...根据上面的方法排查: 最后发现自己在delegate用的不是week而是strong。顿时感觉自己好傻! ? 自己挖的坑 总结:再使用dealloc时,最好先看一下该方法有没有调用!

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

    原因如下:子类调用init(或其他初始化构造方法)初始化对象时候,子类的init会首先调用父类的init(self = [super init]),这样就会调到父类的init方法里,而我们在父类的init...,且ARC中不需要我们手动调用[super dealloc])。...nil; } @end 在SubClass的实例对象销毁时,首先调用子类的dealloc,再调用父类的dealloc(这与init初始化是相反的,且ARC中不需要我们手动调用[super dealloc...从目前的实验来看,当存在继承时,在init或者dealloc方法中使用accessor会存在很高的风险,此时我们可要小心了。...所以,万事无绝对,我们只有理解了为什么不能在init和dealloc方法中使用accessor才能在各种情况下游刃有余。

    9.2K40

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

    - (void)dealloc { [_count release]; _count = nil; [super dealloc]; } 我们也可以在dealloc通过self.count...但是苹果说了,不建议我们在dealloc中使用访问器方法。 - (void)dealloc { self.count = nil; [super dealloc]; } Why?...为什么初始化方法中需要self = [super init]? 先大概解释一下self和super。self是对象指针,指向当前消息接收者。...而此时只是在进行父类的初始化,子类初始化还未完成,所以可能会发生错误。 在销毁子类对象时,首先是调用子类的dealloc,最后调用[super dealloc](这与init相反)。...注意: 如果你使用pthread(POSIX thread)而不是使用NSThread创建子线程,那么你就不能使用 Cocoa 除非 Cocoa 处于多线程模式。

    1.6K21

    一个iOS11上的列表必现crash

    #58: 0x00000001068d4ad5 QGame`-[QGViewController dealloc](self=0x00007fb4623dc910, _cmd="dealloc") at...findCommonAncestorOfItem:andItem:],从方法名上可以看到应该是因为某两个subview的约束出现了问题,这两个item有一个commonAncestor导致了crash,虽然不太明确为什么...因此为了达到逻辑复用和对弹幕面板侵入性最少,选择了新建DanmuCell并在config时将引导关注View贴在弹幕cell上,但同时UITableView中的cell是会回收的,为了保证关注view能响应通知,因此使用了...- (void)configureWithLayout:(DMKItemLayout *)layout { [super configureWithLayout:layout]; if (layout.focusDanmuView...不然会crash- (void)dealloc { [self.focusDanmuView removeFromSuperview]; self.focusDanmuView = nil;

    1.3K50

    编码篇-继承+通知看方法的实现和delloc方法的调用

    ,也就是重写),而实际上 UITableViewCell B 中的方法B设计上不是为 通知A服务的,其中调用的一些未知的数据,所有就出现了崩溃。...,就是因为UITableViewCell B没有在页面被 POP后被释放掉,才会出现这样的 Crash,那么为什么没被释放呢 dealloc的不被调用的情况。...而且重写该方法时不能显式调用[super dealloc],和继承中先加载父类再加载子类相反,注销时先注销子类之后再注销父类。因为系统会自动帮你调用父类的dealloc方法。...1.通知的观察者,或KVO的观察者 由于通知中心是系统的一个单例,你在注册通知的观察者时,实际上是在通知中心注册的, 这时,即使ARC下系统帮我们释放了对象,但是在通知中心的观察还是没有移除,那么当有..., #所以我们这里把 object:self ,即可只接受自己触发的通知,而不会接受到其它 UITableViewCell触发的通知了 #添加之前先移除所有监听,可以解决多次注册相同监听的问题。

    81420

    KVO详解(二)

    这样一改造之后,在外界使用的时候,KVO观察者的添加和KVO变化的监听就可以一起写了,而不必分开写了: ? 一个循环引用的小问题 接下来说一个小点: ?...在保存KVO信息的模型中,关于观察者observer属性的声明使用的是weak关键字,各位知道是为什么吗?这是因为如果不使用weak将会导致循环引用。...那我就会想到,既然这样,我在NSObject+NormanKVO中复写dealloc方法好了: ? 这样做是有问题的,为什么呢?...你想想,我中间子类没有实现dealloc,那么我是不是要到中间子类的父类也就是最初始原类中去查找dealloc?...,KVO 在Foundation框架下,而Foundation的源码是没有开源的,所以我们找不到KVO的源码。

    72231

    iOS应用开发:什么是ARC

    有一点,ARC并不是GC,它只是一种代码静态分析(Static Analyzer)工具。 变化点 通过一小段代码,我们看看使用ARC前后的变化点。... = [super init];     if (self) {             name = [newName retain];         }     return self;    ... = [super init];     if (self) {             name = newName;         }     return self;     }     @...,使用return [[object retain] autorelease]; 而使用ARC后,我们可以不需要这样做了,甚至连最基础的release都不需要了。...,是可以重载该函数的,但是不能调用[super dealloc])     不能使用NSAllocateObject, NSDeallocateObject     不能在C结构体中使用对象指针

    1.1K60

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

    ,原因是因为:野指针其本质是一个指向已经删除的对象或受限内存区域的指针。...这里说的OC野指针,是指OC对象释放后指针未置空而导致的野指针。...这里不必现的原因是因为dealloc执行后只是告诉系统,这片内存我不用了,而系统并没有让这片内存不能访问 野指针解决思路 这里主要是借鉴Xcode中的两种处理方案: image 1、Malloc Scribble...Xcode中僵尸对象是如何实现的,具体操作步骤可以参考这篇文章iOS Zombie Objects(僵尸对象)原理探索 从dealloc的源码中,我们可以看到“Replaced by NSZombie...(Class) Class cls = object_getClass(self); //2、获取类名 const char *clsName = class_getName(cls) //3、生成僵尸对象类名

    2.3K31

    iOS 开发:『Crash 防护系统』(二)KVO 防护

    但是 KVO API 的设计,我个人觉得不是很合理。被观察者需要做的工作太多,日常使用时稍不注意就会导致崩溃。...FBKVOController 对 KVO 机制进行了额外的一层封装,框架不但可以自动帮我们移除观察者,还提供了 block 或者 selector 的方式供我们进行观察处理。...不可否认的是,FBKVOController 为我们的开发提供了很大的便利性。但是相对而言,这种方式对项目代码的侵入性比较大,必须依靠编码规范来强制约束团队人员使用这种方式。...= [super init]; if (self) { _kvoInfoMap = [NSMutableDictionary dictionary]; } return..., keyPath); } @end 可以将示例项目 NSObject+KVODefender.m 中的 + (void)load; 方法注释掉或打开进行防护前后的测试。

    4.4K41

    一份走心的iOS开发规范

    如果方法间接的返回一个或多个值,我们可以使用“getxxx”的方式来命名方法。相反,无需额外的在方法名前面添加"get"。...通常是指发出notification的对象,如果在发送notification的同时要传递一些额外的信息,请使用userInfo,而不是object。...具体参考本人之前的文章《为什么不能在init和dealloc函数中使用accessor方法》、、 (2.5) Block规范 【必须】调用block时需要对block判空。...【必须】post通知时,object通常是指发出notification的对象,如果在发送notification的同时要传递一些额外的信息,请使用userInfo,而不是object。...如果我们是从外部数据源(比如info.plist或preferences)获取的数据,那么推荐使用isEqual:,因为这样更安全。

    12.1K145

    透彻理解 NSNotificationCenter 通知

    博客更新日志: 2018-04-12 —— 在 iOS9 及其之后版本不用在dealloc移除通知,而不是之前说的 iOS8 推荐另一篇文章:透彻理解 KVO 观察者模式(附基于runtime...由此看来,如果当我们不是百分之百确认通知的发送队列是在主队列中时,我们最好加上如下代码从而对我们的UI进行处理。...可能有人会问,为什么系统库没有做个重复添加的判断?当然,这可能是为了让我们更灵活的运用,也可能是对时间复杂度的一种妥协吧?。..._removeObserver:observer]; } @end 然后新建一个类正常的使用通知,但是请不要手动在-dealloc中释放通知(我们要做实验)。...实现自动移除通知(解释为何使用observerId移除通知而不用observer) 实现自动移除通知,思路是在响应者observer走dealloc的时候移除对应的通知,难点就是在ARC中是不允许对dealloc

    2.4K70
    领券