Reviewed By: dulmarod Differential Revision: D2668570 fb-gh-sync-id: 79063e4master
							parent
							
								
									cb42fdcc31
								
							
						
					
					
						commit
						761e4acc08
					
				| @ -0,0 +1,33 @@ | |||||||
|  | /*
 | ||||||
|  | * Copyright (c) 2015 - present Facebook, Inc. | ||||||
|  | * All rights reserved. | ||||||
|  | * | ||||||
|  | * This source code is licensed under the BSD style license found in the | ||||||
|  | * LICENSE file in the root directory of this source tree. An additional grant | ||||||
|  | * of patent rights can be found in the PATENTS file in the same directory. | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | #import <Foundation/Foundation.h> | ||||||
|  | 
 | ||||||
|  | @interface CADisplayLink : NSObject { | ||||||
|  | 
 | ||||||
|  |   id _target; | ||||||
|  |  SEL _selector; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | @property(readonly, nonatomic) CFTimeInterval duration; | ||||||
|  | 
 | ||||||
|  | @property(nonatomic) NSInteger frameInterval; | ||||||
|  | 
 | ||||||
|  | @property(getter=isPaused, nonatomic) BOOL paused; | ||||||
|  | 
 | ||||||
|  | @property(readonly, nonatomic) CFTimeInterval timestamp; | ||||||
|  | 
 | ||||||
|  | // Returns a new display link.
 | ||||||
|  | + (CADisplayLink *)displayLinkWithTarget:(id)target | ||||||
|  |                                 selector:(SEL)sel; | ||||||
|  | 
 | ||||||
|  | // Release the target
 | ||||||
|  | - (void) invalidate; | ||||||
|  | 
 | ||||||
|  | @end | ||||||
| @ -0,0 +1,31 @@ | |||||||
|  | /* | ||||||
|  | * Copyright (c) 2015 - present Facebook, Inc. | ||||||
|  | * All rights reserved. | ||||||
|  | * | ||||||
|  | * This source code is licensed under the BSD style license found in the | ||||||
|  | * LICENSE file in the root directory of this source tree. An additional grant | ||||||
|  | * of patent rights can be found in the PATENTS file in the same directory. | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | #import "CADisplayLink.h" | ||||||
|  | 
 | ||||||
|  | @implementation CADisplayLink | ||||||
|  | 
 | ||||||
|  | // Returns a new display link. | ||||||
|  | // The model retains strongly the target object. | ||||||
|  | + (CADisplayLink *)displayLinkWithTarget:(id)target | ||||||
|  |                                 selector:(SEL)sel { | ||||||
|  | 
 | ||||||
|  |     CADisplayLink *c = [CADisplayLink alloc]; | ||||||
|  |         c->_target = target; | ||||||
|  |         c->_selector = sel; | ||||||
|  | 
 | ||||||
|  |     return c; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Release the target | ||||||
|  | - (void) invalidate { | ||||||
|  |     self->_target = nil; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | @end | ||||||
| @ -0,0 +1,58 @@ | |||||||
|  | /* | ||||||
|  | * Copyright (c) 2015 - present Facebook, Inc. | ||||||
|  | * All rights reserved. | ||||||
|  | * | ||||||
|  | * This source code is licensed under the BSD style license found in the | ||||||
|  | * LICENSE file in the root directory of this source tree. An additional grant | ||||||
|  | * of patent rights can be found in the PATENTS file in the same directory. | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | #import <Foundation/Foundation.h> | ||||||
|  | #import <QuartzCore/QuartzCore.h> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @interface A : NSObject | ||||||
|  | @property (nonatomic, strong) CADisplayLink *displayLink; | ||||||
|  | 
 | ||||||
|  | - (void) bla; | ||||||
|  | - (void) invalidate; | ||||||
|  | @end | ||||||
|  | 
 | ||||||
|  | @implementation A | ||||||
|  | 
 | ||||||
|  | - init { | ||||||
|  |     _displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(bla)]; | ||||||
|  | 
 | ||||||
|  |     return self; | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | - (void) bla {}; | ||||||
|  | 
 | ||||||
|  | - (void) invalidate { | ||||||
|  |     // unregister displayLink target | ||||||
|  |     [_displayLink invalidate]; | ||||||
|  | 
 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | - (void) dealloc { | ||||||
|  |     [self dealloc]; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | @end | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | void testCycle() { | ||||||
|  | 
 | ||||||
|  |     A* a = [[A alloc] init]; | ||||||
|  |     A* b = a; | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void testNoCycle() { | ||||||
|  | 
 | ||||||
|  |     A* a = [[A alloc] init]; | ||||||
|  |     [a invalidate]; //break the cycle | ||||||
|  |     [a dealloc]; | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -0,0 +1,65 @@ | |||||||
|  | /* | ||||||
|  | * Copyright (c) 2015 - present Facebook, Inc. | ||||||
|  | * All rights reserved. | ||||||
|  | * | ||||||
|  | * This source code is licensed under the BSD style license found in the | ||||||
|  | * LICENSE file in the root directory of this source tree. An additional grant | ||||||
|  | * of patent rights can be found in the PATENTS file in the same directory. | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | package endtoend.objc; | ||||||
|  | 
 | ||||||
|  | import static org.hamcrest.MatcherAssert.assertThat; | ||||||
|  | import static utils.matchers.ResultContainsExactly.containsExactly; | ||||||
|  | 
 | ||||||
|  | import com.google.common.collect.ImmutableList; | ||||||
|  | 
 | ||||||
|  | import org.junit.BeforeClass; | ||||||
|  | import org.junit.ClassRule; | ||||||
|  | import org.junit.Test; | ||||||
|  | 
 | ||||||
|  | import java.io.IOException; | ||||||
|  | 
 | ||||||
|  | import utils.DebuggableTemporaryFolder; | ||||||
|  | import utils.InferException; | ||||||
|  | import utils.InferResults; | ||||||
|  | import utils.InferRunner; | ||||||
|  | 
 | ||||||
|  | public class CADisplayLinkTest { | ||||||
|  | 
 | ||||||
|  |   public static final String CAD_FILE = | ||||||
|  |       "infer/tests/codetoanalyze/objc/errors/memory_leaks_benchmark/CADisplayLinkRetainCycle.m"; | ||||||
|  | 
 | ||||||
|  |   private static ImmutableList<String> inferCmd; | ||||||
|  | 
 | ||||||
|  |   public static final String RETAIN_CYCLE = "RETAIN_CYCLE"; | ||||||
|  | 
 | ||||||
|  |   @ClassRule | ||||||
|  |   public static DebuggableTemporaryFolder folder = new DebuggableTemporaryFolder(); | ||||||
|  | 
 | ||||||
|  |   @BeforeClass | ||||||
|  |   public static void runInfer() throws InterruptedException, IOException { | ||||||
|  |     inferCmd = InferRunner.createObjCInferCommand( | ||||||
|  |         folder, | ||||||
|  |         CAD_FILE); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   @Test | ||||||
|  |   public void RetainCycleShouldBeFound() | ||||||
|  |       throws InterruptedException, IOException, InferException { | ||||||
|  |     InferResults inferResults = InferRunner.runInferObjC(inferCmd); | ||||||
|  |     String[] methods = { | ||||||
|  |       "testCycle", | ||||||
|  |     }; | ||||||
|  |     assertThat( | ||||||
|  |         "Results should contain " + RETAIN_CYCLE, | ||||||
|  |         inferResults, | ||||||
|  |         containsExactly( | ||||||
|  |             RETAIN_CYCLE, | ||||||
|  |             CAD_FILE, | ||||||
|  |             methods | ||||||
|  |         ) | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  | } | ||||||
					Loading…
					
					
				
		Reference in new issue