mirror of https://github.com/oxen-io/session-ios
				
				
				
			Merge branch 'charlesmchen/timerRetainCycle'
						commit
						4468b465d8
					
				| @ -0,0 +1,19 @@ | ||||
| //
 | ||||
| //  Copyright (c) 2017 Open Whisper Systems. All rights reserved.
 | ||||
| //
 | ||||
| 
 | ||||
| NS_ASSUME_NONNULL_BEGIN | ||||
| 
 | ||||
| @interface NSTimer (OWS) | ||||
| 
 | ||||
| // This method avoids the classic NSTimer retain cycle bug
 | ||||
| // by using a weak reference to the target.
 | ||||
| + (NSTimer *)weakScheduledTimerWithTimeInterval:(NSTimeInterval)timeInterval | ||||
|                                          target:(id)target | ||||
|                                        selector:(SEL)selector | ||||
|                                        userInfo:(nullable id)userInfo | ||||
|                                         repeats:(BOOL)repeats; | ||||
| 
 | ||||
| @end | ||||
| 
 | ||||
| NS_ASSUME_NONNULL_END | ||||
| @ -0,0 +1,69 @@ | ||||
| // | ||||
| //  Copyright (c) 2017 Open Whisper Systems. All rights reserved. | ||||
| // | ||||
| 
 | ||||
| #import "NSTimer+OWS.h" | ||||
| #import <objc/runtime.h> | ||||
| 
 | ||||
| NS_ASSUME_NONNULL_BEGIN | ||||
| 
 | ||||
| @interface NSTimerProxy : NSObject | ||||
| 
 | ||||
| @property (nonatomic, weak) id target; | ||||
| @property (nonatomic) SEL selector; | ||||
| 
 | ||||
| @end | ||||
| 
 | ||||
| #pragma mark - | ||||
| 
 | ||||
| @implementation NSTimerProxy | ||||
| 
 | ||||
| - (void)timerFired:(NSDictionary *)userInfo | ||||
| { | ||||
| #pragma clang diagnostic push | ||||
| #pragma clang diagnostic ignored "-Warc-performSelector-leaks" | ||||
|     [self.target performSelector:self.selector withObject:userInfo]; | ||||
| #pragma clang diagnostic pop | ||||
| } | ||||
| 
 | ||||
| @end | ||||
| 
 | ||||
| #pragma mark - | ||||
| 
 | ||||
| static void *kNSTimer_OWS_Proxy = &kNSTimer_OWS_Proxy; | ||||
| 
 | ||||
| @implementation NSTimer (OWS) | ||||
| 
 | ||||
| - (NSTimerProxy *)ows_proxy | ||||
| { | ||||
|     return objc_getAssociatedObject(self, kNSTimer_OWS_Proxy); | ||||
| } | ||||
| 
 | ||||
| - (void)ows_setProxy:(NSTimerProxy *)proxy | ||||
| { | ||||
|     OWSAssert(proxy); | ||||
| 
 | ||||
|     objc_setAssociatedObject(self, kNSTimer_OWS_Proxy, proxy, OBJC_ASSOCIATION_RETAIN); | ||||
| } | ||||
| 
 | ||||
| + (NSTimer *)weakScheduledTimerWithTimeInterval:(NSTimeInterval)timeInterval | ||||
|                                          target:(id)target | ||||
|                                        selector:(SEL)selector | ||||
|                                        userInfo:(nullable id)userInfo | ||||
|                                         repeats:(BOOL)repeats | ||||
| { | ||||
|     NSTimerProxy *proxy = [NSTimerProxy new]; | ||||
|     proxy.target = target; | ||||
|     proxy.selector = selector; | ||||
|     NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:timeInterval | ||||
|                                                       target:proxy | ||||
|                                                     selector:@selector(timerFired:) | ||||
|                                                     userInfo:userInfo | ||||
|                                                      repeats:repeats]; | ||||
|     [timer ows_setProxy:proxy]; | ||||
|     return timer; | ||||
| } | ||||
| 
 | ||||
| @end | ||||
| 
 | ||||
| NS_ASSUME_NONNULL_END | ||||
					Loading…
					
					
				
		Reference in New Issue