首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏浮躁的喧嚣

    内存管理--31:dealloc

    dealloc 当一个对象的引用计数为0时,这个对象即将被销毁,其占的内存被系统回收 对象即将被销毁时系统会自动给对象发送一条dealloc的消息,看dealloc方法有没有被调用来判断对象是否被销毁 dealloc方法重写 一般重写dealloc方法,在这里释放相关资源(移除监听者、移除coreFoundation对象等等) 在MRC下,一旦重写dealloc方法,就必须调用[super dealloc ],并且放在最后调用 使用注意 不直接调用dealloc 不要在dealloc方法中调用其他方法 一旦对象被回收了,它占的内存就不再可用

    15210编辑于 2023-11-22
  • 来自专栏娱乐心理测试

    ARC 环境下 dealloc 的使用误区

    一.dealloc 的使用 a. 什么情况下会调用呢? 当对象的引用计数为0,系统会自动调用dealloc方法,回收内存。 //调用方法 -(void)dealloc{ // [super dealloc]; //ARC环境下不需要调用。因为系统会 自动调用该方法帮助释放父类对象。 二.dealloc 误区 我们在开发过程中,用到dealloc,却因不会意识得到对象的引用计数是不是为0,dealloc到底走了没走,因而导致内存暴增,还会遇到很多奇怪的问题。 我们需要知道dealloc不被调用的几种情况? 自己挖的坑 总结:再使用dealloc时,最好先看一下该方法有没有调用!

    1.1K40发布于 2018-08-02
  • 来自专栏清墨_iOS分享

    iOS dispatch_after延迟执行导致延迟dealloc

    [self presentViewController:newVC animated:YES completion:nil]; } 然后在NewViewController里: -(void)dealloc { NSLog(@"--------------dealloc"); } - (void)viewDidLoad { [super viewDidLoad]; UIButton image.png 结果说明我们dismiss的时候,newVC还没有被释放,dealloc方法在dispatch_after延迟方法执行之后才会走,原因就是dispatch_after强引用了self (即newVC),等强引用过去,self才能得到释放走dealloc。 image.png 当我们用weak修饰self时,dispatch_after并没有强引用self,所以我们dissmiss时,dealloc立马就会走,然后10s后,dispatch_after的执行函数还是会执行

    2.5K20发布于 2021-04-15
  • 来自专栏TechBox

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

    为什么不能在dealloc中调用accessor 还是基于子类重写了父类的value属性这一前提,在子类对象销毁时,首先调用子类的dealloc,最后调用父类的dealloc(这与init初始化方法是相反的 ,且ARC中不需要我们手动调用[super dealloc])。 但此时子类已经释放(因为先调用子类的dealloc,后调用父类的dealloc),所以就会出现错误甚至崩溃。 [super dealloc])。 为了更清晰地阐述,以下分别从init和dealloc上举例说明。 结尾 在init和dealloc中使用accessor是存在风险的。但这并不代表百分之百的崩溃或者百分之百的错误。

    9.6K40发布于 2018-06-05
  • 来自专栏晨光的Code

    一个iOS11上的列表必现crash

    ] + 508 frame #9: 0x000000011157bcaf UIKit`-[UITableViewCellContentView dealloc] + 68 frame #10 UIKit`-[UIScrollView dealloc] + 816 frame #26: 0x0000000110f5d990 UIKit`-[UITableView dealloc] + dealloc](self=0x00007fb4623dc910, _cmd="dealloc") at QGLiveVCContainer.m:119:1 frame #60: 0x0000000111001252 的时候,当UITableView进行dealloc时,会对所有的cell进行dealloc,cell的subview会执行removeFromSuperView方法,最后crash在[NSLayoutConstraint 修复方案,在danmuCell的dealloc方法里手动讲引导关注按钮removeFromSuperView,并将danmuCell中的指针置为nil,这样保证了cell在dealloc时不再需要处理引导关注按钮

    1.5K50编辑于 2022-12-01
  • 来自专栏数据库相关

    【转】sqlserver 定位大量占用tempdb的sql语句

    , t1.user_objects_dealloc_page_count,t3.login_name,t3.login_time,t3.last_request_start_time,t3.status :可以查询该session的相关信息internal_objects_alloc_page_count:分配给session内部对象的数据页internal_objects_dealloc_page_count 从internal_objects_dealloc_page_count可以看到占用tempdb的数据已经释放了。3. + task_user_dealloc )*8 as [SPACE Deallocated FOR USER Objects (in KB)],DB_NAME( t1.database_id ) AS ) as task_internal_dealloc,sum(user_objects_alloc_page_count ) as task_user_alloc,sum(user_objects_dealloc_page_count

    28610编辑于 2025-09-18
  • 来自专栏网罗开发

    iOS 如何解决 NSTimer 循环引用

    当你在 VC 的 dealloc 方法中销毁 timer,发现 VC 被 pop,VC 的 dealloc 方法没走,VC 在等 timer 释放才走 dealloc,timer 释放在 dealloc 解决方案 ---- 在 ViewController 执行 dealloc 前释放 timer(不推荐) 对定时器 NSTimer 封装 苹果 API 接口解决方案(iOS 10.0 以上可用) 使用 在 ViewController 执行 dealloc 前释放 timer(不推荐) ---- 可以在 viewWillAppear 中创建 timer 可以在 viewWillDisappear 中销毁 ; } - (void)dealloc{ NSLog(@"%s",__func__); [_timer invalidate]; _timer = nil; } @end 在 ,然后在 dealloc 方法中执行 NSTimer 的销毁,相对的 PFTimer 也会进行销毁了。

    1.8K30发布于 2021-04-07
  • 来自专栏韦弦的偶尔分享

    [译] Objective-C init:为什么避免向 self 发消息会有帮助?

    苹果公司有一份关于实用内存管理的文档,其中有一节的标题是 "不要在初始化方法和 dealloc 中使用访问方法"。 { [_count release]; [super dealloc]; } Objective-C init/dealloc:拯救 ivars 解决方法很简单:在 Objective-C 的 init 和 dealloc 方法中,直接访问实例变量,而不是通过属性。 { [_something release]; [super dealloc]; } 在 init/dealloc 中向 self 发送信息时仍能正常工作 在说过 "避免在 init 和 dealloc 中向 self 发送信息 "之后,我现在想缓和一下这种说法。

    27710编辑于 2024-02-29
  • 来自专栏清墨_iOS分享

    iOS从timer释放问题看内存管理

    { [timer invalidate]; timer = nil; NSLog(@"dealloc"); } 当我们点击跳回按钮dissmiss的时候,dealloc方法并没有得到调用 ,timer还在一直跑着,因为dealloc方法的调用得在timer释放之后,而timer的释放在dealloc里,相互等待,这样就永远得不到释放了。 ,跳回的时候,dealloc方法也会走,定时器得到释放,停止输出。 { NSLog(@"dealloc"); } 我们没有调用GCD timer的释放方法 dispatch_source_cancel(GCD_timer); dealloc方法还是走到了,这是因为 这些时候,只要在 调用dealloc 时判断下,已经调用过 dispatch_suspend 则再调用下 dispatch_resume后再cancel,然后再释放timer。

    2K20发布于 2019-04-01
  • 来自专栏搜狗测试

    iOS计时器:NSTimer

    ; } - (void)dealloc { [self.timer invalidate]; NSLog(@"TimerViewController dealloc!") NSTimer 需要在 TimerViewController 的 dealloc 方法被 invalidate 。 NSTimer 被 invalidate 的前提是 TimerViewController 被 dealloc。 ; } - (void)dealloc { [self.timer invalidate]; NSLog(@"TimerViewController dealloc!") ; }]; } - (void)dealloc { [self.timer invalidate]; NSLog(@"TimerViewController dealloc!"

    2.2K20发布于 2020-07-16
  • 来自专栏ShaoYL

    OC内存管理

    当对象被销毁时,系统会自动向对象发送一条dealloc消息,一般会重写dealloc方法,在这里释放相关的资源,dealloc就像是对象的“临终遗言”。 一旦重写了dealloc方法就必须调用[super dealloc],并且放在代码块的最后调用(不能直接调用dealloc方法)。 方法的代码规范 (1)一定要[super dealloc],而且要放到最后 (2)对self(当前)所拥有的的其他对象做一次release操作 -(void)dealloc { [_car release ARC中在property处不再使用retain,而是使用strong,在dealloc中不需要再[super dealloc]。 (三)ARC的特点总结: (1)不允许调用release,retain,retainCount  (2)不允许重写dealloc,但是不允许调用[super dealloc] (3)@property的参数

    1.2K90发布于 2018-05-11
  • 来自专栏落影的专栏

    iOS crash分析实践

    访问weak指针 weak指针经常被应用到在代理、block避免循环引用,避免有一个特性就是对象dealloc的时候,指向对象的weak指针会被置为nil。 方法访问到该按钮,则会发生crash; 2、详情页的某个view,使用getter的方式获取,在dealloc方法时访问了该getter; getter实现 ? dealloc创建对象的weak指针会crash? 如图,子线程的堆栈都是在dealloc方法,一层层递归。 结果BDRpcAsyncOperation在子线程销毁时,dealloc方法层层递进,最终触发了某个对象在子线程销毁,而该对象会在dealloc方法处理一些UI相关的逻辑。

    2K20发布于 2020-06-16
  • 来自专栏iOS 技术分享

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

    dealloc消息。 - (void)dealloc { [_count release]; _count = nil; [super dealloc]; } 我们也可以在dealloc通过self.count 但是苹果说了,不建议我们在dealloc中使用访问器方法。 - (void)dealloc { self.count = nil; [super dealloc]; } Why? 在销毁子类对象时,首先是调用子类的dealloc,最后调用[super dealloc](这与init相反)。 特别是,你不应该设计类,以便在你想让系统调用dealloc时就调用它。由于bug或应用程序崩溃,dealloc的调用可能会被延迟或未调用。

    2.2K21发布于 2020-04-24
  • 来自专栏日常技术分享

    iOS View 生命周期

    void)willMoveToWindow:(UIWindow *)newWindow -(void)didMoveToWindow -(void)didMoveToSuperview -(void)dealloc void)removeFromSuperview{ NSLog(@"layoutSubviews"); [super removeFromSuperview]; } - (void)dealloc { NSLog(@"dealloc"); } @end - (void)testCase{ _testView = [TestView new]; [self.view addSubview TestDemo[28304:5846595] didmovetosuperview 2019-08-28 11:03:50.373521+0800 TestDemo[28304:5846595] dealloc

    1.6K20发布于 2019-08-29
  • 来自专栏iOS技术

    记 libAccessibility 通知 Crash 排查

    那就 Hook UILabel 的-initWithFrame: / dealloc方法,打印其地址、堆栈、父视图链条等消息,触发 zombie 时根据地址找到对应的信息: dealloc 时 UILabel ] + 136 1 CustomApp 0x0000000103d8a3e0 -[UILabel(Foo) dealloc] + 96 __has_feature(objc_arc) [super dealloc]; #endif } @end 这是在分类里面的定义,相当于把-[UILabel dealloc]方法调用跳过了,看下其实现 : UIKitCore`-[UILabel dealloc]: … 0x1b3ed0624 <+52>: bl 0x1b54ad680 ; objc_msgSend 这个文件是直接 copy 的开源代码,导致了全局-[UILabel dealloc]走不到,再次证明了无脑 copy 代码的危害性。

    81120编辑于 2022-12-10
  • 来自专栏猿人谷

    iOS应用开发:什么是ARC

    dealloc中需要这样做: 类如果注册了通知(观察者模式),需要remove掉。这个不管是否支持arc,都必须要做的。 - (void)dealloc { [[NSNotificationCenterdefaultCenter] removeObserver:self];//如果注册了通知的话。 [array release]; //array代表alloc但没有autorelease的变量     [super dealloc]; #endif }     总结:   1,arc的设置是在build ARC基本规则 retain, release, autorelease, dealloc由编译器自动插入,不能在代码中调用     dealloc虽然可以被重载,但是不能调用[super dealloc 方法来管理一些资源,但不能用来释放实例变量,也不能在dealloc方法里面去掉[super dealloc]方法,在ARC下父类的dealloc同样由编译器来自动完成         3.Core

    1.5K60发布于 2018-01-17
  • 来自专栏MelonTeam专栏

    Objective-C内存管理原理探究(一)

    do_dealloc = true; it->second |= SIDE_TABLE_DEALLOCATING; } else if (! return do_dealloc; } release需要判断最终是否需要调用dealloc,所以会复杂些,流程如下: 1)先遍历 table.refcnts,寻找是否有对应对象的retainCount 所以可以发现表中存的引用计数实际上存的是真实的引用计数-1),如果小于do_dealloc = true 3)否则就减去一个SIDE_TABLE_RC_ONE(引用计数-1) 4)最后看do_dealloc 是否需要调用deallocdealloc的实现 - (void)dealloc { _objc_rootDealloc(self); } void _objc_rootDealloc(id obj) { assert

    1.3K100发布于 2018-01-04
  • 来自专栏正则

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

    ,其官方解释如下:申请内存 alloc 时在内存上填0xAA,释放内存 dealloc 在内存上填 0x55。 调用栈 6、监控策略 1)只监控自定义对象 2)白名单策略 3)黑名单策略 4)监控所有对象 7、交换NSObject的dealloc方法 触发野指针 1、开始处理对象 2、是否达到替换条件 的dealloc方法为自定义的dealloc方法 2、为了避免内存空间释放后被重写造成野指针的问题,通过字典存储被释放的对象,同时设置在30s后调用dealloc方法将字典中存储的对象释放,避免内存增大 _enabled) { //hook根类的dealloc方法 [self _swizzleDealloc]; _enabled = ")); //hook - 交换dealloc方法的IMP实现 IMP originalDeallocImp = __mi_swizzleMethodWithBlock(

    2.9K31发布于 2021-10-28
  • 来自专栏阿林前端开发攻城狮

    iOS中 用FMDB封装一个SQLite数据库

    import "DataBaseHandle.h" #import "FMDB.h" #import "PersonModel.h" @implementation DataBaseHandle (void)dealloc { self.db = nil; [super dealloc]; } 创建单例的的接口: //创建单例对象使其存在于静态区 static DataBaseHandle ,copy)NSString *age; @end PersonModel.m import "PersonModel.h" @implementation PersonModel (void)dealloc { self.name = nil; self.age = nil; self.ID = nil; [super dealloc]; } @end ========= { self.dataSource = nil; [super dealloc]; } //懒加载 (NSMutableArray *)dataSource{ if

    79410发布于 2021-10-29
  • 来自专栏菩提树下的杨过

    objective-C 的内存管理之-引用计数

    方法(类似于c#中的dispose方法),开发人员可以在dealloc中释放或清理资源。 当前引用计数:%d",[self retainCount]); } return (self); } -(void) dealloc{ NSLog(@"析构函数将要执行... ,当前引用计数:%d",[self retainCount]); [super dealloc]; } @end 代码很简单,除了"构造函数"跟"析构函数"之外,没有任何其它多余处理。 ok,我们来改造一下Man.m中的dealloc()方法,改成下面这样: //析构函数 -(void) dealloc { NSLog(@"\"%@\"要死了! ",_name); [_shoe release];//这里释放_shoe [super dealloc]; } 即:在Man被销毁的时候,先把_shoe给销毁。

    1.1K100发布于 2018-01-22
领券