自定義KVO(探索KVO底層本質)

2021-08-15 03:40:14 字數 2539 閱讀 7181

標頭檔案

#import 

@inte***ce

nsobject (kvo)

- (void)lyj_addobserver:(nsobject *)observer forkeypath:(nsstring *)keypath options:(nskeyvalueobservingoptions)options context:(nullable void *)context;

- (void)lyj_addobserver:(nsobject *)observer forkeypath:(nsstring *)keypath options:(nskeyvalueobservingoptions)options context:(nullable void *)context block:(void(^)(id object ,nsdictionary *change))block;

@end

體檔案

/*

oc的方法

1.sel 目錄

2.imp 頁碼

** 內容

*/#import "nsobject+kvo.h"

#import

@implementation

nsobject (kvo)

//自定義的kvo

-(void)lyj_addobserver:(nsobject *)observer forkeypath:(nsstring *)keypath options:(nskeyvalueobservingoptions)options context:(void *)context

-(void)lyj_addobserver:(nsobject *)observer forkeypath:(nsstring *)keypath options:(nskeyvalueobservingoptions)options context:(void *)context block:(void (^)(id, nsdictionary *))block

void setname(id

self,sel _cmd,nsstring * newname);

//修改name屬性!!

objc_msgsendsuper(&person, _cmd,newname);

//拿出觀察者!!

id observer = objc_getassociatedobject(self, @"objc");

//呼叫observer的

objc_msgsend(observer, @selector(observevalueforkeypath:ofobject:change:context:),@"name",self,@,nil);

}

呼叫

@implementation

viewcontroller

- (void)viewdidload ];

// [p lyj_addobserver:self forkeypath:@"name" options:nskeyvalueobservingoptionnew context:nil block:^(id object, nsdictionary *change) ];

//// [p lyj_addobserver:self forkeypath:@"name" options:nskeyvalueobservingoptionnew context:nil block:^(id object, nsdictionary *change) ];

//// [p lyj_addobserver:self forkeypath:@"name" options:nskeyvalueobservingoptionnew context:nil block:^(id object, nsdictionary *change) ];

//// [p lyj_addobserver:self forkeypath:@"name" options:nskeyvalueobservingoptionnew context:nil block:^(id object, nsdictionary *change) ];

//// [p lyj_addobserver:self forkeypath:@"name" options:nskeyvalueobservingoptionnew context:nil block:^(id object, nsdictionary *change) ];

_p = p;

}- (void)touchesbegan:(nsset*)touches withevent:(uievent *)event

@end

呼叫可以看到

此時person為lyjkvo_person 為person的子類

KVO實現自定義檔案複製進度展示

一 建立檔案 說明 自定義檔案類,通過nsfilemanager 以及nsfilehandle 實現檔案的建立和copy,為了控制記憶體的併發使用,通過控制每次賦值的固定長度來分多次複製 nsstring path nshomedirectory desktop boby.m nsstring ta...

自定義表盤探索1

0關於android wear開發,對於我來說是個新鮮活兒,下面就來說說心得把 1.基本手勢 如何在手錶裡寫好乙個service,先模仿,然後最重要的要知道手錶怎麼用,經過摸索,他們有如下幾個功能 下拉 看通知欄 上拉 看應用提示 左滑1步 看帶activity的應用 載滑就是通訊錄等其他功能了 還...

自定義元件使用spring底層元件

把spring底層一些元件注入到自定義的bean中 例如 獲得spring ioc容器給當前bean設定的名稱,實現beannameaware介面 獲得特殊符號的解析器,實現embeddedvalueresolveraware介面 aware介面都是繼承aware介面,實現aware介面的類都有乙個...