categoryとextensionの違い

1780 ワード

category
コンセプト
Category(分類)は、Objective-C 2.0以降に追加される言語特性であり、categoryの主な役割は、既存のクラス(システムクラスソースコードがない場合でも)に動的にメソッドを追加することである.このほかappleではcategoryの他の2つの使用シーンも推奨されています
  • はクラスの実装をいくつかの異なるファイルに分けることができる.これにはいくつかの明らかな利点があり、a)単一ファイルの体積bを減らすことができる)異なる機能を異なるcategoryに組織することができるc)複数の開発者が1つのクラスdを共同で完成することができる)必要に応じて所望のcategoryなどをロードすることができる.
  • プライベートメソッド
  • を宣言
    使用
    分類を作成すると、生成されます.mファイルと1つ.hファイル.はい.hファイルに分類方法を宣言し、.mファイルで実装します.外部はこの分類方法を直接呼び出すことができる.
    //   People       
    //   .h   
    #import "People.h"
    
    @interface People (eat)
    //      
    - (void)eat;
    
    @end
    
    //   .m  
    #import "People+eat.h"
    
    @implementation People (eat)
    //      
    - (void)eat{
        NSLog(@"  ");
    }
    
    @end
    

    extension
    コンセプト
  • Extension(クラス拡張)はCategoryの特例であり、名前は匿名(空)である.
  • extensionはコンパイル期間で、クラスの一部であり、コンパイル期間とヘッダファイルの@interfaceと実装ファイルの@implementとともに完全なクラスを形成し、クラスの発生に伴って発生し、ともに消滅する.extensionは一般的にクラスのプライベート情報を隠すために使用されます.クラスにextensionを追加するには、クラスのソースコードが必要です.そのため、NSStringなどのシステムのクラスにextensionを追加することはできません.

  • 使用
    クラス拡張子を作成すると、クラス拡張子が生成されます.hファイル、はい.hファイルに拡張方法を宣言し、クラスの.mファイルで拡張方法を実装します.この拡張メソッドはプライベートメソッドであり,外部から呼び出すことはできない.
    //   People       
    #import "People.h"
    
    @interface People ()
    //      
    - (void)sleep;
    
    @end
    

    categoryとextensionの違い
  • 同じ点:クラスにメソッド
  • を追加できます.
  • 相違点:
  • 1、Categoriesは@implementationで実装を提供しておらず、コンパイラはエラーを報告せず、呼び出しを実行中にエラーが発生した.Extensionsは@implementationで実装を提供していません.コンパイラは警告します.
  • 2、Categoryはメソッドの追加にのみ使用でき、メンバー変数の追加には使用できません.extensionで宣言されたメソッドと追加されたメンバー変数はプライベートであり、プライマリimplementのみが呼び出すことができ、外部のクラスは呼び出すことができません.
  • 3、Categoryが増加したメソッドはクラスのメソッドと同名であれば、Categoryの優先度が高いため、元のクラスのメソッドを上書きします!Extensionsでは、エラーが競合します.