小编pol*_*ech的帖子

在 Swift 中使用泛型参数函数模拟类

我正在尝试对简单的 HttpClient 行为进行单元测试。为此,我创建了一个 GenericHttpClientInterface 协议和实现该协议的具体类 GenericHttpClient。

protocol GenericHttpClientInterface {
    func makeRequest<T: Decodable>(request: URLRequest) -> Observable<T>
}

class GenericHttpClient: GenericHttpClientInterface {
    func makeRequest<T: Decodable>(request: URLRequest) -> Observable<T> {
        return URLSession.shared.rx.data(request: request).jsonDecode(to: T.self)
    }
}
Run Code Online (Sandbox Code Playgroud)

我想要实现的是模拟该类:

class MockHttpClient: GenericHttpClientInterface {
    var invokedMakeRequestCount = 0
    var invokedMakeRequestParameters: (request: URLRequest, Void)?
    var stubbedMakeRequestResult: Observable<Any>!
    func makeRequest<T: Decodable>(request: URLRequest) -> Observable<T> {
        invokedMakeRequestCount += 1
        invokedMakeRequestParameters = (request, ())
        return stubbedMakeRequestResult as! Observable<T>;
    }
}
Run Code Online (Sandbox Code Playgroud)

给ma带来的问题是,我正在模拟的方法具有通用参数T,其中是请求将被解码到的类。在我调用这个函数之前我不知道这个参数,所以基本上在 MockHttpClient 类中为我创建的 makeRequest 存储存根数据的属性:

stubbedMakeRequestResult: Observable<Any>

返回它后,我尝试将其转换为结果类型 Observable。这给了我一个警告

Cast …
Run Code Online (Sandbox Code Playgroud)

unit-testing mocking ios xctest swift

6
推荐指数
1
解决办法
1304
查看次数

UINavigationController hidesBarOnSwipe内存泄漏问题

我的hidesBarOnSwipe财产有问题UINavigationController.

概述:

链接到项目文件

我有一个名为FirstViewController的控制器,它是根视图UINavigationController.一切都在Main.storyboard.FirstViewController包含UIButton操作.在该操作中,我实例化一个SecondViewController并将其推送到导航堆栈.

- (IBAction)button:(id)sender {
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];

    [self.navigationController pushViewController:vc animated:YES];
}
Run Code Online (Sandbox Code Playgroud)

在SecondViewController中,只有一个hidesBarsOnSwipe属性设置为YESon viewDidLoad:

- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationController.hidesBarsOnSwipe = YES;
}
Run Code Online (Sandbox Code Playgroud)

和dealloc得到NSLogged:

- (void)dealloc {
    NSLog(@"Dealloc");
}
Run Code Online (Sandbox Code Playgroud)

问题:

当我们向上滑动以隐藏navigationBar时,dealloc永远不会被调用.Instruments在这里显示SecondViewController内存泄漏.

当我们在SecondViewController上,我们只需按下后退按钮 - 一切都很好.Dealloc被召唤.

肯定有某种保留周期,但我不知道为什么以及如何避免这种情况.

memory-leaks objective-c uinavigationbar uinavigationcontroller ios

5
推荐指数
1
解决办法
582
查看次数