Objective C 语言 如何实现观察者模式的弱引用

Objective-C阿木 发布于 2025-06-29 7 次阅读


摘要:

观察者模式是一种设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。在 Objective-C 中,实现观察者模式时,为了避免循环引用,通常会使用弱引用。本文将详细介绍在 Objective-C 中如何实现观察者模式的弱引用。

关键词:Objective-C,观察者模式,弱引用,设计模式

一、

在 Objective-C 中,对象之间的依赖关系很常见,尤其是在 MVC(Model-View-Controller)架构中。观察者模式允许对象在状态发生变化时通知其他对象,从而实现数据同步和业务逻辑的解耦。如果不当处理,观察者模式可能会导致循环引用,影响对象的内存管理。为了解决这个问题,我们可以使用弱引用。

二、观察者模式概述

观察者模式包含两个主要角色:观察者(Observer)和被观察者(Observable)。被观察者维护一个观察者列表,当状态发生变化时,通知所有观察者。观察者则订阅被观察者的状态变化,并在变化发生时做出响应。

三、弱引用的概念

弱引用(Weak Reference)是一种引用类型,它不会增加对象的引用计数。在 Objective-C 中,使用弱引用可以防止循环引用,因为当对象被弱引用持有时,它不会阻止对象被回收。

四、实现观察者模式的弱引用

以下是一个简单的观察者模式实现,使用弱引用来避免循环引用:

objc

// Observable.h


@interface Observable : NSObject

@property (nonatomic, copy) NSString name;

- (void)addObserver:(NSObject<ObservableObserver>)observer;


- (void)removeObserver:(NSObject<ObservableObserver>)observer;


- (void)notifyObservers;

@end

// Observable.m


@interface Observable ()

@property (nonatomic, strong) NSMutableArray<NSObject<ObservableObserver>> observers;

@end

@implementation Observable

- (instancetype)init {


self = [super init];


if (self) {


_observers = [NSMutableArray array];


}


return self;


}

- (void)addObserver:(NSObject<ObservableObserver>)observer {


if (![self.observers containsObject:observer]) {


[self.observers addObject:observer];


}


}

- (void)removeObserver:(NSObject<ObservableObserver>)observer {


[self.observers removeObject:observer];


}

- (void)notifyObservers {


for (NSObject<ObservableObserver> observer in self.observers) {


[observer observable:self];


}


}

@end

// ObservableObserver.h


@protocol ObservableObserver <NSObject>

- (void)observable:(Observable )observable;

@end

// ExampleObserver.m


@interface ExampleObserver ()

@property (nonatomic, weak) Observable observable;

@end

@implementation ExampleObserver

- (instancetype)init {


self = [super init];


if (self) {


_observable = nil;


}


return self;


}

- (void)setObservable:(Observable )observable {


_observable = observable;


}

- (void)observable:(Observable )observable {


// Handle the notification here


NSLog(@"Observer received notification from observable: %@", observable.name);


}

@end

// Usage


Observable observable = [[Observable alloc] init];


ExampleObserver observer = [[ExampleObserver alloc] init];

[observer setObservable:observable];


[observable addObserver:observer];


[observable setName:@"New Name"];


[observable notifyObservers];

[observable removeObserver:observer];


五、总结

在 Objective-C 中实现观察者模式时,使用弱引用可以有效地避免循环引用,从而保证对象的正确回收。本文通过一个简单的示例,展示了如何使用弱引用实现观察者模式,并提供了相关的代码实现。

通过这种方式,我们可以确保在观察者模式中,观察者和被观察者之间的关系不会导致内存泄漏,同时保持了代码的简洁性和可维护性。

六、进一步探讨

在实际项目中,观察者模式可以应用于多种场景,如网络请求回调、UI更新、事件监听等。在实现时,可以根据具体需求调整观察者列表的管理方式,以及通知机制。还可以考虑使用更高级的观察者模式实现,如观察者链、发布-订阅模式等,以满足更复杂的业务需求。