IOS面接の質問の概要2

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ファイルを含めることができない理由について説明します。

 



 


 

おすすめ

転載: blog.csdn.net/Draven__/article/details/90726461