iOS 面試第七節 訊息傳遞的方式

2021-09-29 18:09:34 字數 3941 閱讀 7517

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 作為乙個物件導向的語言,必然也會引入抽象類這一概念。介面和抽象類使您可以建立元件互動的定義。通過介面,可以指定元件必須實現的方法,但不實際指定如何實...