简体   繁体   中英

Strange retain cycle warning in unit tests in Xcode

I have a service that I'm currently writing a unit test for. The code works as expected, but I'm getting a strange retain cycle warning.

[self.myService doSomethingCoolWithCompletionBlock:^(MyResponseObject *obj) {
    XCTAssertNil(obj, @"obj should be nil");
}];

The XCTAssertNil(obj, @"obj should be nil"); line shows a warning in Xcode Capturing 'self' strongly in this block is likely to lead to a retain cycle .

If I change the code to the following, the warning is removed:

__weak MyService *weakService = self.myService;
[weakService doSomethingCoolWithCompletionBlock:^(MyResponseObject *obj) {
    XCTAssertNil(obj, @"obj should be nil");
}];

I am using self.someService in other unit tests, and never had this issue. Anyone experienced this before?

EDIT

I have another test that has the following:

[self.myService doSomethingElseCoolWithCompletionBlock:(NSArray *results) {
    XCTestAssertNotNil(results, @"results should not be nil");
}];

This doesn't give me a warning. The only difference I see is that this is checking an array, and the other is checking an object of a specific type.

assert it is macros and used self inside. so you need create local variable with name self.

__weak id weakSelf = self;
self.fooBlock = ^{
    id self = weakSelf;
    XCTAssert(YES);
};

Don't do this:

@interface MyCoolTests : XCTestCase

@property (retain) id myService;

@end

@implementation MyCoolTests

-(void)testCoolness{
  self.myService = [MyService new];

  self.myService.callback = ^{
    XCTAssert(YES);
  };
  // ...
}

@end

Do this:

@interface MyCoolTests : XCTestCase


@end

@implementation MyCoolTests

-(void)testCoolness{
  id myService = [MyService new];

  myService.callback = ^{
    XCTAssert(YES);
  };
  // ...
}

@end

It's a limitation of XCTTestCase and it probably catches people when using the setup method.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM