這道題是這樣:項目中有個地方用到了KVO图贸,例子:
<pre><code>
[aModel addObserver:self forKeyPath:@"someKey" options:NSKeyValueObservingOptionNew context:nil];
</code></pre>
@“someKey”是aModel的一個屬性名
如果aModel這個類頻繁重構(gòu),someKey的名字變?yōu)锧“anotherKey”,上面的KVO代碼編譯器是不會給出修改提示的辩蛋,那這個KVO實際上就失效了褐墅。這時候如何運用IDE的編譯特性來提示開發(fā)者去修改該Key呢置媳?
這個時候可以用到編譯器對@selector的檢查結(jié)合runtime API來實現(xiàn)上述目標(biāo),獲取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>
當(dāng)然也可以在NSObject的category里封裝上述方法,但是封裝之后就沒有編譯提示了儡循,在代碼運行期間會直接crash在class_getInstanceMethod()方法處舶吗。