MST

星途 面试题库

面试题:Objective-C的Reachability网络监测在多视图控制器中的处理

假设你有一个基于导航控制器的应用程序,多个视图控制器都需要使用Reachability进行网络状态监测。如何确保在不同视图控制器切换时,网络监测能够正确工作,并且避免内存泄漏?请详细阐述设计思路和实现步骤。
36.7万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 单例模式:使用单例模式创建Reachability实例,确保整个应用程序中只有一个网络监测实例,避免重复创建和内存管理问题。
  2. 通知机制:利用NSNotificationCenter(或在Swift中使用NotificationCenter)来通知不同的视图控制器网络状态的变化,而不是每个视图控制器都直接持有和管理Reachability实例。
  3. 生命周期管理:在视图控制器的生命周期方法中注册和注销通知,以确保在视图控制器出现和消失时正确处理网络状态监测,避免内存泄漏。

实现步骤(以Objective - C为例)

  1. 创建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
  1. 在视图控制器中注册和注销通知
#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
  1. 在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)
    }
}

通过以上步骤,在基于导航控制器的应用程序中,不同视图控制器能够正确监测网络状态,同时利用单例和通知机制有效避免内存泄漏。