如何防止修改readonly修飾的屬性值

當咱們的對象的某些個屬性不須要對外提供set方法修改賦值時,那麼咱們在定義屬性時會給屬性添加readonly。bash

1.正常賦值

這樣經過set方法修改readonly修飾的屬性時,會報錯ui

Assignment to readonly property
複製代碼

2.存在問題

對於readonly修飾的屬性仍是能夠經過KVC修改的。this

3.如何防止KVC修改readonly修飾的屬性

重寫自定義類的「accessInstanceVariablesDirectly」方法,讓其返回值爲NO。 核心代碼:spa

+(BOOL)accessInstanceVariablesDirectly{
    return NO;
}

複製代碼

這樣再經過KVC修改時會報錯.net

reason: '[<Animal 0x600000019e40> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key name.'
複製代碼

4.原理:

當使用setValue:forKey:來設置對象屬性的值時系統會按一下順序來查找對應的key:code

1.查找是否存在set<key>:這樣格式的方法;

2.若是上面方法未找到,則接受消息對象的類方法「accessInstanceVariablesDirectly」會返回YES(默認返回YES),再按下面順序繼續查找;

3._<key> , _is<Key> , <key> , is<Key> 的順序查找是否存在對應的key,若是找到將改變key所對應的值。

4.最後仍是沒有找到對應的存取方法或者實例變量,那麼將走進 setValue:forUndefinedKey: 拋出以下異常:

reason: '[<Animal 0x60400001ec70> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key namekk.'
複製代碼

關鍵點便在上面的第2步accessInstanceVariablesDirectly方法的調用,系統默認是返回YES,咱們將該方法重寫後,讓其返回NO,這樣就直接走進setValue:forUndefinedKey:方法,並拋出異常,進行提示!對象

原文引用:修改readonly修飾屬性的值!blog

相關文章
相關標籤/搜索