w@toc
**舉例實現原理:
model的.**件
#import
@inte***ce xkcmodel : nsobject
//@property (nonatomic, copy) nsstring *name;
@property
(nonatomic, assign)
int age;
@end
model的.m檔案
#import "xkcmodel.h"
@implementation xkcmodel
//- (void)setname:(nsstring *)name -(
void
)setage:
(int
)age
+(bool)accessinstancevariablesdirectly -(
void
)setvalue:
(id)value forundefinedkey:
(nsstring *
)key
-(id)valueforundefinedkey:
(nsstring *
)key
@end
有關實際呼叫方法
-
(void
)testmodelkvc
**舉例keypath:
//基類model
@inte***ce cyxmodel: nsobject
@property
(nonatomic, strong) nsstring *name;
@property
(nonatomic, strong) cyxshopmodel *product;
@end
//子model
@inte***ce cyxshopmodel: nsobject
@property
(nonatomic, strong) nsstring * productname;
@end
//設值
//正常
cyxmodel *model =
[[cyxmodel alloc]init]
;model. name =
@"cyx"
;cyxshopmodel *shopmodel =
[[cyxshopmodel alloc]init]
;shopmodel. productname =
@"nike"
;model. product = shopmodel;
//kvc
cyxmodel *model =
[[cyxmodel alloc]init]
;nsstring *name =
[model valueforkey:
@"name"];
nsstring *productname =
[model valueforkeypath:
@"product.productname"];
//取值
//正常
kvo-鍵值觀察機制,原理如下:當給a類新增kvo的時候,runtime動態的生成了乙個子類nskvonotifying_a,讓a類的isa指標指向nskvonotifying_a類,重寫class方法,隱藏物件真實類資訊
重寫監聽屬性的setter方法,在setter方法內部呼叫了foundation 的 _nssetobjectvalueandnotify 函式
_nssetobjectvalueandnotify函式內部
a) 首先會呼叫 willchangevalueforkey
b) 然後給屬性賦值
c) 最後呼叫 didchangevalueforkey
d) 最後呼叫 observer 的 observevalueforkeypath 去告訴***屬性值發生了改變 .
重寫了dealloc做一些 kvo 記憶體釋放
**如下
person物件監聽model中的age變化
監聽者
//
// kvoobjecttest.m
// testbbb
//// created by marchwood on 2019/11/19.
//#import "kvoobjecttest.h"
@implementation kvoobjecttest
//@dynamic name; //宣告自己接管set get 重寫的方法
//@synthesize name = _name; //自己生成 如果都沒寫則是預設實現這個的,也就是set getm系統幫你寫了-(
void
)setname:
(nsstring *
)name -(
void
)addobser:
(xkcmodel *
)people -(
void
)observevalueforkeypath:
(nsstring *
)keypath ofobject:
(id)object change:
(nsdictionary *
)change context:
(void
*)context
else}-
(void
)dealloc
@end
被監聽物件
//
// xkcmodel.m
// testbbb
//// created by marchwood on 2019/11/19.
//#import "xkcmodel.h"
@implementation xkcmodel-(
void
)setage:
(int
)age }+
(bool)automaticallynotifiesobserversforkey:
(nsstring *
)key
//- (void)willchangevalueforkey:(nsstring *)key
////- (void)didchangevalueforkey:(nsstring *)key
@end
block在沒有使用外部變數時,記憶體存在全域性區,然而,當block在使用外部變數的時候,記憶體是存在於棧區,當block copy之後,是存在堆區的。存在於棧區的特點是物件隨時有可能被銷毀,一旦銷毀在呼叫的時候,就會造成系統的崩潰。所以block要用copy關鍵字。 第七節 指標
go語言有指標這一概念。直接上 func pointtest 定義int型別的值a,並且賦值為3 定義int型別指標變數p,並且取a的位址賦值給p 輸出a和p 控制台 3 0xc00000a0a8 3 process finished with exit code 0 a的值為3,p為a在記憶體中的...
第七節 獨立按鍵之中斷方式
複製key工程,重新命名為keyinterrupt。剛剛我們用查詢的方式讀取按鍵的狀態。但是這種方式在實際的工程中沒有實際的應用價值,下面我們採用外部中斷的方式來讀取按鍵的狀態,每當按鍵按下時就會觸發一次外部中斷。為了p0.0口能夠觸發中斷,我們需要進行如下配置 p0ien 0x01 p00 設定為...
第七節 覆蓋虛介面
有時候我們需要表達一種抽象的東西,它是一些東西的概括,但我們又不能真正的看到它成為乙個實體在我們眼前出現,為此物件導向的程式語言便有了抽象類的概念。c 作為乙個物件導向的語言,必然也會引入抽象類這一概念。介面和抽象類使您可以建立元件互動的定義。通過介面,可以指定元件必須實現的方法,但不實際指定如何實...