IOS 性能优化之“僵尸”对象的处理

本文介绍了如何通过Objective-C的Runtime机制来避免僵尸对象问题,从而防止应用因野指针访问已释放对象而崩溃。通过替换`dealloc`方法,确保对象释放后变成一个安全的代理类`Zombie`,并在接收到消息时记录相关信息,而不是直接崩溃。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先声明,“僵尸”对象和内存泄漏并无关系,但是和内存泄漏一样,产生“僵尸”对象也是极其严重的内存管理问题。当一个对象被释放后,如果其指针没有置空,则这个指针就变成了野指针,此时这个指针指向的就是“僵尸”对象。

一般在开发中,对于“僵尸”对象我们都不需要特别处理。因为如果开发者访问到了一个已经无效的对象,那么本身就是代码逻辑出了问题,这里我们主要讨论如何处理“僵尸”对象,以避免产生Crash。

我们知道,向空指针发送任何消息都是无效的,因此也可以明确,访问到“僵尸”对象的根本原因是野指针的问题。

这里我们使用runtime的消息转发机制来避免所有的“僵尸”对象问题。

//
//  NSObject+NSZombie.h
//  UseMemery
//
//  Created by Alisa on 2022/5/12.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface NSObject (NSZombie)

@end

NS_ASSUME_NONNULL_END
//
//  NSObject+NSZombie.m
//  UseMemery
//
//  Created by Alisa on 2022/5/12.
//

#import "NSObject+NSZombie.h"
#import <objc/runtime.h>
#import "Zombie.h"

@implementation NSObject (NSZombie)

//使用load方法在main函数之前执行runtime时调用
+(void)load
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值