弱引用NSTimer对象
2015-07-09 23:12
260 查看
不要忘记 NSTimer 会 retain它的对象,意味着如果你的timer的 target 也是 NSTimer的 拥有者的时候,很容易就进入一个循环引用。
你可以通过一个 代理的delegate来 绕过这个, 这个代理对象拥有这个真正target的 weak 引用。
@interface
TMWeakTimerTarget :
NSObject
- (instancetype)initWithTarget:(id)target selector:(SEL)selector;
- (void)timerDidFire:(NSTimer *)timer;
@end
@interface
TMWeakTimerTarget()
@property (nonatomic,
weak) id target;
@property (nonatomic) SEL selector;
@end
@implementation
TMWeakTimerTarget
#pragma mark - Initialization
- (instancetype)initWithTarget:(id)target selector:(SEL)selector {
if (self = [super init]) {
_target = target;
_selector = selector;
}
return self;
}
- (id)init {
return [self initWithTarget:nil selector:nil];
}
#pragma mark - TMWeakTimerTarget
- (void)timerDidFire:(NSTimer *)timer {
if (self.target) {
// `performSelector:` would generate a potential leak warning (http://stackoverflow.com/a/7073761/503916)
objc_msgSend(self.target,
self.selector);
}
else {
[timer invalidate];
}
}
@end
你可以创建一个 NSTimer的 Category ,来更容易的使用这个类
/**
* Method that can be used in favor of `scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:` in case the target retains the timer instance. Using the aforementioned method would create a retain cycle in this
case.
*/
@interface
NSTimer (RetainCyclePrevention)
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)timeInterval
weakTarget:(id)target
selector:(SEL)selector
userInfo:(id)userInfo
repeats:(BOOL)yesOrNo;
@end
@implementation
NSTimer (RetainCyclePrevention)
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)timeInterval
weakTarget:(id)target
selector:(SEL)selector
userInfo:(id)userInfo
repeats:(BOOL)yesOrNo {
return [self scheduledTimerWithTimeInterval:timeInterval
target:[[TMWeakTimerTarget alloc] initWithTarget:target
selector:selector]
selector:@selector(timerDidFire:)
userInfo:userInfo
repeats:yesOrNo];
}
@end
相关文章推荐
- 1985年公布的C++语言1.0版的内容中又添加了一些重要特征
- 关于Linux下上网速度慢的问题
- API其他函数 ,system date,..
- 工具类CTools实现字符编码转换和获取当前路径
- 无主之地1
- C++这个名字
- leetCode 40.Combination Sum II(组合总和II) 解题思路和方法
- 一致性hash算法-php-redis版本
- KMP与扩展KMP
- [UGUI] 用脚本给UI绑定事件2
- 集合(3) Map集合,工具类
- 读陈浩的《C语言结构体里的成员数组和指针》总结,零长度数组
- 2015070903 - 必须依靠自己
- C#递归复制文件夹
- 【HM】第12课:文件上传&文件下载&注解
- SuperRecyclerView——使RecyclerView更加容易使用的Android类库
- 7-9工作日志
- hdu 4781 Assignment For Princess
- [MySQL] - errno:150
- C++基础---经典著作列表