1. iosKVOの実現原理とKVOとKVCの違い
たとえば、NSMutableArrayでは、AnimalヘッダーファイルにNSMutableArrayのプロパティを追加し、ViewControllerでaddObject操作を実行しました。
実行した後、配列に値を追加しても通知が送信されないことがわかりました。なぜですか??
結論:KVOは、オブジェクトの変数ではなく、プロパティのsetメソッドを監視します。また、addObjectメソッドは明らかにsetメソッドではないため、通知はトリガーされません。
NSMutableArrayのaddObjectメソッドを証明できない場合は、別の例を使用して証明します
動物ヘッダーファイルで名前の変数を宣言します
ViewControllerでname属性をリッスンします
実行後、通知が送信されていないことが判明しました
低レベルの実装:
addObserver関数が呼び出されると、システムの実行時にシステムは自動的にAnimalクラスをNSKVONotifying_Animalクラスに置き換え、同時にsetメソッドをオーバーライドします。addObserver関数を見ると、関数が次のようになっていることがわかります。 NSObjectカテゴリの下@interfaceNSObject(NSKeyValueObserverRegistration)
コンテナは、KVC -Key-Valueコーディングテクノロジを使用して監視を実装します。
iOSには、addObjectメソッドを監視するためのKVO配列を生成するためのmutableArrayValueForKeyなどの複数のKVCメソッドが用意されています。
2.クラス拡張と分類の違い
クラス拡張(クラス拡張は匿名分類とも呼ばれます)##
- 効果:
- 追加の属性、メンバー変数、およびメソッド宣言をクラスにアタッチできます
- 一般的なクラス拡張子は.mファイルに書き込まれます
- 一般的なプライベート属性はクラス拡張に書き込まれます
- 使用形式:
@interface Mitchell()
//属性
//方法
@end
-
分類との違い
- カテゴリには括弧で囲まれた名前が必要です
@interfaceクラス名(カテゴリ名)
/メソッド宣言/
@end
@implementationクラス名(カテゴリ名)
/メソッド実装/
@end
`` ` -category
はメソッドのみを展開でき、属性やメンバー変数は展開できません(メンバー変数が含まれている場合、エラーを直接報告してください)。
-属性が分類で宣言されている場合、分類はこの属性のセットとgetメソッド宣言のみを生成します。つまり、実装はありません。
-例:クラスの展開と分類にそれぞれ2つの属性を追加すると、
クラス拡張とカテゴリ1.1.png
次に、初期化メソッドで値を割り当てます。
クラス拡張とカテゴリ1.1.png
カテゴリで宣言された属性textOneに値を割り当てると、クラッシュしたことがわかります。クラッシュの原因を確認しましょう。
クラス拡張とカテゴリ1.3.png
これは、作成したオブジェクトにtextOne属性がないことを意味します。つまり、カテゴリでプロパティを宣言しますが、エラーは報告されません但是@property并没有自动为我们设置的属性生成set、get方法
。
- 別のクラスの実装ファイルが繰り返し含まれるため、クラスの.mファイルを含めることができない理由について説明します。