這道題是這樣:項目中有個地方用到了KVO,例子:
<pre><code>
[aModel addObserver:self forKeyPath:@"someKey" options:NSKeyValueObservingOptionNew context:nil];
</code></pre>
@“someKey”是aModel的一個屬性名
如果aModel這個類頻繁重構,someKey的名字變?yōu)锧“anotherKey”,上面的KVO代碼編譯器是不會給出修改提示的,那這個KVO實際上就失效了。這時候如何運用IDE的編譯特性來提示開發(fā)者去修改該Key呢?
這個時候可以用到編譯器對@selector的檢查結合runtime API來實現(xiàn)上述目標,獲取property的屬性名稱。
代碼示例:
<pre><code>
Class cls = [aModelclass];
Method method = class_getInstanceMethod(cls, @selector(someKey));
SEL selector = method_getName(method);
NSString *key = NSStringFromSelector(selector);
[aModel addObserver:self forKeyPath:@"someKey" options:NSKeyValueObservingOptionNew context:nil];
</code></pre>
當然也可以在NSObject的category里封裝上述方法,但是封裝之后就沒有編譯提示了,在代碼運行期間會直接crash在class_getInstanceMethod()方法處。