我正在尝试对简单的 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) 我的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