解决方案
让定时器指着另一个对象,让那个对象来执行LXFTimerView中需要执行的方法。 引用关系如下图所示
创建一个继承于NSObject的类 LXFWeakTarget,并提供一个创建定时器的方法(苹果官方的方法,对scheduledTimerWithTimeInterval进行转到定义操作【就是command+左键】就可以得到) LXFWeakTarget.h
#import <Foundation/Foundation.h>
@interface LXFWeakTarget : NSObject
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo;
@end
#import "LXFWeakTarget.h"
@interface LXFWeakTarget()
@property(nonatomic, weak) id target;
@property(nonatomic, assign) SEL selector;
@end
@implementation LXFWeakTarget
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo {
// 创建当前类的对象
LXFWeakTarget *object = [[LXFWeakTarget alloc] init];
object.target = aTarget;
object.selector = aSelector;
return [NSTimer scheduledTimerWithTimeInterval:ti target:object selector:@selector(execute:) userInfo:userInfo repeats:yesOrNo];
}
- (void)execute:(id)obj {
[self.target performSelector:self.selector withObject:obj];
}
@end
在LXFTimerView.m中导入LXFWeakTarget的头文件
#import "LXFWeakTarget.h"
将创建定时器的类改为 LXFWeakTarget
复制代码
self.timer = [LXFWeakTarget scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(log) userInfo:nil repeats:YES];
现在再来执行一下程序

最后缕下思路
-
我们用一个LXFWeakTarget来替LXFTimerView执行一些操作。
当没有被定时器强引用的LXFTimerView从父控件上被移除时,就会执行dealloc方法,LXFTimerView被销毁。
将定时器作废并设为nil,这样定时器对LXFWeakTarget的引用也没有了,LXFWeakTarget也会被销毁。
好,那“为什么LXFTimerView中的timer属性要用weak”这个问题就不用多加解析了吧。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持ASPKU。
注:相关教程知识阅读请移步到IOS开发频道。










