IOS 在開發中使用KVO觀測屬性變化

2021-07-05 20:00:42 字數 961 閱讀 4356

不久前在開發中,有乙個只有內部方法才能修改的變數,我就用readonly來修飾。

@property

(nonatomic

, readonly, 

getter

=isshouldrequestmsg) 

bool

shouldrequestmsg;

但是當值發生變化的時候,想要引發外部類物件的一些操作,我就想使用kvo去觀測這個值的變化。

addobserver

:self

forkeypath

:@"shouldrequestmsg"

options

:nskeyvalueobservingoptionnew

context

:null];

本以為實現了這些就可以獲取想要的狀態變化,斷點卻發現沒碰到對應的kvo方法。

對於readonly的屬性,外部只有read的許可權,沒有write的許可權,也就是說外部不能明確的檢測到乙個readonly屬性的變化狀態。

所以預期的效果,沒有達到,後來把readonly的修飾符去掉,程式如想象的正常執行。

@property

(nonatomic

,getter

=isshouldrequestmsg)

bool

shouldrequestmsg;

注意在addobserver的類的實現中,在dealloc方法中去remove掉對應keypath的observer。

如下:removeobserver

:self

forkeypath

:@"shouldrequestmsg"];

如果你在dealloc方法中,remove掉沒有註冊的keypath,將會造成crash.

總結:kvo機制的執行是可取的,但是凡是涉及到屬性的讀取狀態的變化的,還是要慎重使用,注意細節,方能減少bug的出現。

在iOS開發中使用FMDB

sqlite 是乙個輕量級的關聯式資料庫。ios sdk很早就支援了sqlite,在使用時,只需要加入 libsqlite3.dylib 依賴以及引入 sqlite3.h 標頭檔案即可。但是,原生的sqlite api在使用上相當不友好,在使用時,非常不便。於是,開源社群中就出現了一系列將sqlit...

在iOS開發中使用FMDB

sqlite 是乙個輕量級的關聯式資料庫。ios sdk很早就支援了sqlite,在使用時,只需要加入 libsqlite3.dylib 依賴以及引入 sqlite3.h 標頭檔案即可。但是,原生的sqlite api在使用上相當不友好,在使用時,非常不便。於是,開源社群中就出現了一系列將sqlit...

在iOS開發中使用FMDB

sqlite 是乙個輕量級的關聯式資料庫。ios sdk很早就支援了sqlite,在使用時,只需要加入 libsqlite3.dylib 依賴以及引入 sqlite3.h 標頭檔案即可。但是,原生的sqlite api在使用上相當不友好,在使用時,非常不便。於是,開源社群中就出現了一系列將sqlit...