iOS 自動移除KVO觀察者

2021-09-08 13:48:27 字數 2050 閱讀 9932

對nsobject寫乙個分類:

#import

@inte***ce nsobject (fmobserverhelper)

- (void)fm_addobserver:(nsobject *)observer forkeypath:(nsstring *)keypath;

@end

//  物件被釋放之前, 會呼叫dealloc方法, 其持有的例項變數也會被釋放.

//  在監聽註冊時, 為self和observer關聯個臨時物件, 當兩者在釋放例項變數時, 借助這個時機, 在臨時物件的dealloc方法中, 移除observer

//  self在被釋放之前, 會先釋放其持有的關聯屬性, self並未完全釋放, 可在臨時物件中target卻成了nil.

//  weak: 持有者不會對目標進行retain, 當目標銷毀時, 持有者的例項變數會被置空

//  unsafe_unretained: 持有者不會對目標進行retain, 當目標釋放後, 持有者的例項變數還會依然指向之前的記憶體空間(野指標)

//  如果observer提前釋放,而新增關聯屬性, 兩者還不能同時持有臨時物件, 否則臨時物件也不會及時的釋放,既然乙個不行, 那就各自關聯乙個.

//  兩個關聯屬性釋放的同時, 進行了兩次觀察移除的操作. 為避免這個問題, 需要判斷weak引用的例項變數factor是否為空即可

#import "nsobject+fmobserverhelper.h"

#import

@inte***ce fmobserverhelper : nsobject

@property (nonatomic, unsafe_unretained) id target;

@property (nonatomic, unsafe_unretained) id observer;

@property (nonatomic, strong) nsstring * keypath;

@property (nonatomic, weak) fmobserverhelper * factor;

@end

@implementation fmobserverhelper

- (void)dealloc {

if ( _factor ) {

[_target removeobserver:_observer forkeypath:_keypath];

@end

@implementation nsobject (fmobserverhelper)

- (void)fm_addobserver:(nsobject *)observer forkeypath:(nsstring *)keypath {

[self addobserver:observer forkeypath:keypath options:nskeyvalueobservingoptionnew context:nil];

fmobserverhelper * helper = [fmobserverhelper new];

fmobserverhelper * sub = [fmobserverhelper new];

sub.target = helper.target = self;

sub.observer = helper.observer = observer;

sub.keypath = helper.keypath = keypath;

helper.factor = sub;

sub.factor = helper;

const char * helpekey = [nsstring stringwithformat:@"%zd", [observer hash]].utf8string;

objc_setassociatedobject(self, helpekey, helper, objc_association_retain_nonatomic);

objc_setassociatedobject(observer, helpekey, sub, objc_association_retain_nonatomic);

@end

ios 使用觀察者模式

觀察者模式 在cocoa touch框架中,觀察者模式的具體應用有兩個 通知機制 notification 機制和kvo key value observing 機制 通知機制 通知機制和委託模式不同的是,前者是 一對多 的物件之間的通訊,後者是 一對一 的物件之間的通訊 通知主要有三種 廣播通知 ...

iOS開發之觀察者

觀察者事件 註冊必刪除 indexviewinformation sharedinstance addobserver self forkeypath selectedmoremodel options nskeyvalueobservingoptionnew nskeyvalueobserving...

iOS 觀察者設計模式

觀察者模式用於當某件事情發生時去執行某事 當某件事發生的時候,就會通知所有的觀察者 1.首先要新增觀察者 或者稱為監聽者 因為生產者需要維護這乙個所有觀察者的陣列,當某件事情發生時就迴圈這個資料,依次進行對每個觀察者進行通知 2.當某件時發生時就傳送通知 在ios中觀察者模式已經被封裝成了nsnot...