面试题答案
一键面试设计思路
- 单例模式:使用单例模式创建Reachability实例,确保整个应用程序中只有一个网络监测实例,避免重复创建和内存管理问题。
- 通知机制:利用NSNotificationCenter(或在Swift中使用NotificationCenter)来通知不同的视图控制器网络状态的变化,而不是每个视图控制器都直接持有和管理Reachability实例。
- 生命周期管理:在视图控制器的生命周期方法中注册和注销通知,以确保在视图控制器出现和消失时正确处理网络状态监测,避免内存泄漏。
实现步骤(以Objective - C为例)
- 创建Reachability单例:
#import "Reachability.h"
@interface ReachabilityManager : NSObject
@property (nonatomic, strong) Reachability *reachability;
+ (instancetype)sharedManager;
@end
@implementation ReachabilityManager
+ (instancetype)sharedManager {
static ReachabilityManager *sharedManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedManager = [[self alloc] init];
sharedManager.reachability = [Reachability reachabilityForInternetConnection];
[sharedManager.reachability startNotifier];
});
return sharedManager;
}
@end
- 在视图控制器中注册和注销通知:
#import "ViewController.h"
#import "ReachabilityManager.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil];
}
- (void)reachabilityChanged:(NSNotification *)notification {
Reachability *reachability = (Reachability *)notification.object;
NetworkStatus status = [reachability currentReachabilityStatus];
if (status == ReachableViaWiFi || status == ReachableViaWWAN) {
NSLog(@"网络可用");
} else {
NSLog(@"网络不可用");
}
}
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self name:kReachabilityChangedNotification object:nil];
}
@end
- 在Swift中的实现:
import UIKit
import SystemConfiguration
class ReachabilityManager {
static let shared = ReachabilityManager()
var reachability: Reachability?
private init() {
reachability = Reachability()
reachability?.startNotifier()
}
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(reachabilityChanged), name: Notification.Name.reachabilityChanged, object: nil)
}
@objc func reachabilityChanged(notification: Notification) {
guard let reachability = notification.object as? Reachability else { return }
let status = reachability.connection
if status == .wifi || status == .cellular {
print("网络可用")
} else {
print("网络不可用")
}
}
deinit {
NotificationCenter.default.removeObserver(self, name: Notification.Name.reachabilityChanged, object: nil)
}
}
通过以上步骤,在基于导航控制器的应用程序中,不同视图控制器能够正确监测网络状态,同时利用单例和通知机制有效避免内存泄漏。