簡體   English   中英

密鑰路徑的安全密鑰值觀察

[英]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

刪除對象作為某些KVO屬性的觀察者的最佳實踐

該線程中可接受的答案最能描述您的情況。 首先,您不應該查看物業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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM