[英]Safe Key Value Observing of keypaths
我正在嘗試實現對鍵路徑進行觀察的安全鍵值。 假設我有一個名為person
的數據模型對象,該對象具有一個workplace
屬性。 反過來, workplace
具有我希望觀察的address
屬性,因此我通過以下調用設置了要觀察的鍵值:
[person addObserver:theObserver
forKeyPath:@"workplace.address"
options:NSKeyValueObservingOptionNew
context:NULL];
直到此人不更換工作場所,此方法才能正常工作。 一旦發生這種情況:
person.workplace = newWorkplace;
KVC系統正確地崩潰了該應用程序,並說“ oldAddress已被釋放,而鍵值觀察者仍在其中注冊”。 (為oldAddress以前工作場所的地址)。
不幸的是,我無法調整“人”對象類的實現,以通知觀察者工作場所將要消失。 是否有任何模式可以避免此類崩潰? 也許可以收到其他通知? 在KVC中如何遍歷密鑰路徑,您是否可以訪問此鏈?
編輯2
花一些時間與志願后,我發現,你的情況,你應該觀察person.workplace.address
而不是workplace.address
。 當您觀察person.workplace.address
,您會實現兩件事:
1)由於您擁有person
對象,因此您可以完全控制對象的生命周期。 現在,您可以在自己的時間選擇removeObserver。
2)更改workplace
對象時,KVO機制將“自動”觀察新workplace
的新address
。 當然,它將通知您新address
。
現在,您可以觀察address
而不必擔心會隨機更換workplace
。 這是KVO真正的隱藏力量之一。 這樣子類就可以安全地觀察任何超類的對象,而無需知道它們的生命周期。
編輯1
該線程中可接受的答案最能描述您的情況。 首先,您不應該查看物業address
,因為您無法控制workplace
的生命周期。 您有一個設計問題。
原版的
您可以在person對象上觀察keyPath workplace
。 當此的keyPath被調用時,您只需removeObserver的workplace.address
。
[person addObserver:theObserver for KeyPath:@“ workplace”選項:[NSKeyValueObservingOptionNew]上下文:NULL];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.