首先声明,“僵尸”对象和内存泄漏并无关系,但是和内存泄漏一样,产生“僵尸”对象也是极其严重的内存管理问题。当一个对象被释放后,如果其指针没有置空,则这个指针就变成了野指针,此时这个指针指向的就是“僵尸”对象。
一般在开发中,对于“僵尸”对象我们都不需要特别处理。因为如果开发者访问到了一个已经无效的对象,那么本身就是代码逻辑出了问题,这里我们主要讨论如何处理“僵尸”对象,以避免产生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