gpt4 book ai didi

ios - 如何访问类类别中的 dealloc 方法?

转载 作者:可可西里 更新时间:2023-11-01 04:14:24 24 4
gpt4 key购买 nike

我需要在类别的 dealloc 方法中执行一个操作。我试过 swizzling,但这不起作用(这也不是一个好主意)。

如果有人问,答案是否定的,我不能使用子类,这是专门针对类别的。

我想使用 [NSTimer scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:][self performSelector:withObject:afterDelay:] 和在 dealloc 上取消它。

第一个问题是 NSTimer 保留了我不想要的目标。 [self performSelector:withObject:afterDelay:] 不保留,但我需要能够在 中调用 [NSObject cancelPreviousPerformRequestsWithTarget:selector:object:] dealloc 方法,否则我们会崩溃。

有什么关于如何在类别上执行此操作的建议吗?

最佳答案

我仍然认为将您的类子类化并且不要弄乱运行时会更好,但如果您确定需要在类别中进行,我为您准备了一个选项。它仍然会影响运行时,但我认为比 swizzling 更安全。

考虑编写一个辅助类,比如调用它 DeallocHook ,它可以附加到任何 NSObject 并在这个 NSObject 被释放时执行一个 Action .然后你可以这样做:

// Instead of directly messing with your class -dealloc method, attach
// the hook to your instance and do the cleanup in the callback
[DeallocHook attachTo: yourObject
callback: ^{ [NSObject cancelPrevious... /* your code here */ ]; }];

您可以使用 objc_setAssociatedObject 实现 DeallocHook:

@interface DeallocHook : NSObject
@property (copy, nonatomic) dispatch_block_t callback;

+ (id) attachTo: (id) target callback: (dispatch_block_t) block;

@end

实现是这样的:

#import "DeallocHook.h"
#import <objc/runtime.h>

// Address of a static global var can be used as a key
static void *kDeallocHookAssociation = &kDeallocHookAssociation;

@implementation DeallocHook

+ (id) attachTo: (id) target callback: (dispatch_block_t) block
{
DeallocHook *hook = [[DeallocHook alloc] initWithCallback: block];

// The trick is that associations are released when your target
// object gets deallocated, so our DeallocHook object will get
// deallocated right after your object
objc_setAssociatedObject(target, kDeallocHookAssociation, hook, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

return hook;
}


- (id) initWithCallback: (dispatch_block_t) block
{
self = [super init];

if (self != nil)
{
// Here we just copy the callback for later
self.callback = block;
}
return self;
}


- (void) dealloc
{
// And we place our callback within the -dealloc method
// of your helper class.
if (self.callback != nil)
dispatch_async(dispatch_get_main_queue(), self.callback);
}

@end

请参阅有关 Objective-C runtime 的 Apple 文档有关关联引用的更多信息(尽管我想说文档关于这个主题不是很详细)。

我没有对此进行彻底的测试,但它似乎有效。只是想我会给你另一个研究方向。

关于ios - 如何访问类类别中的 dealloc 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14708905/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com