iOS-拡張、クラス、エージェントプロトコル


カテゴリ
適用
システム内のクラスなど、既存のクラスに拡張子を追加すると、クラスに追加されたメソッドはクラスに継承され、実行時に他のメソッドと区別されません.
サブクラスの代わりに、サブクラスを定義して使用する必要はなく、既存のクラスに直接メソッドを追加することができます.
クラス内のメソッドを分類しcatigopryを用いて膨大なクラスを小さなブロックに分けてそれぞれ開発し,クラス内のメソッドの更新とメンテナンスをよりよく行う.
クラスに追加する方法は元のクラスの一部になります
注意:もちろんCategoryを使うには注意が必要な問題もあります.
1、Categoryは元のクラスのインスタンス変数にアクセスできますが、インスタンス変数を追加することはできません.変数を追加する場合は、継承によるサブクラスの作成によって実現されます.2、Categoryは元のクラスを再ロードする方法がありますが、あまりお勧めしません.そうすれば、元のクラスを上書きする方法があります.再ロードする場合は、継承によってサブクラスを作成します.3、通常のインタフェースとは異なり、Categoryの実装ファイルのインスタンスメソッドは、呼び出しをしない限り、すべての宣言のすべてのメソッドを実装する必要はありません.
命名方法:クラス名+拡張方法
「UIalertView+AFNetworking」のように.クラスのインタフェース宣言はクラスの定義とよく似ていますが、クラスは親クラスを継承せず、カッコを付けるだけで、クラスの主な用途を示します.
CategoryとSubClassの違い
ぶんかつ
Category
SubClass
機能
クラスにメソッドを追加するしかありません
クラスにメソッドを追加したり、変数を追加したりできます.
特長
新たに追加されたメソッドは元のクラスの一部となり、クラスに継承されます.
新しく追加されたメソッドは子クラスのみで、親クラスに子クラスがない場合は呼び出すことができます.プロジェクト開発が終了すると
使用
元のクラスのインスタンス(-メソッド)または元のクラス(+メソッド)を使用してメソッドを呼び出す
サブクラスを使用してメソッドを追加するには、書き込みコードのタイプを置換する必要があります(親をサブクラスに置換)
コード:
  .h  
#import <Foundation/Foundation.h>
//               
@interface NSString (CSayHi)
-(void)sayHi;//     
@end

  .m  
#import "NSString+CSayHi.h"
@implementation NSString (CSayHi)
-(void)sayHi{//       
    NSLog(@"         ,     %@",self);
}
@end

使用
#import <UIKit/UIKit.h>
#import "NSString+CSayHi.h"
- (void)viewDidLoad {
    [super viewDidLoad];
        NSString *str=@"hello";//            
        [str sayHi];//      
}

のび
拡張は特殊な形式のクラス目拡張で定義する方法であり、クラス自体で拡張定義を実現するのは自分のクラスであり、アクティブコードのクラス拡張が必要である.mファイル上の拡張は名前表示方法を提供しないで実現しなければならない.名前を提供しても実現しないことができる.
さぎょう
クラスのプライベートメソッドの定義、クラスのプライベートメソッドの管理
インプリメンテーション
形式はクラスと同じで、新しくファイルを作成する必要はありません.ただ、クラスのinterfaceの場所のファイルを拡張する必要があるクラスに置いただけです.mファイルの中.
#import "Student.h"
@interface Student (extension)// Student          text
-(void)text;
@end

@implementation Student
-(void)hello;
{
    [self  text];
}
-(void)text
{
    NSLog(@"  ");
}
@end

    [student hello]        “  ”。         text  ,[student text]    。   .m      self       text。        。

プロトコル
1.プロトコルは、他のクラスによって実装できる方法を宣言する.合意自体は実現しない.プロトコルは標準であり、プロトコルを受け入れる対象が実現する.
2.プロトコルはクラスではなく、他のオブジェクトが実装できるインタフェースです.コード#コード#
インプリメンテーション
ocのプロトコルは@protocolによって宣言されたメソッドのリストのセットによって他のクラスが実現することを要求し、@interface部分の宣言@protocolプロトコル名//実現しなければならないプロトコル方法@required//オプション実現@opyional@end
エージェントモードとは、自分が実際のことをしないで、他の人に必要なことをする対象を要求することである.エージェント2を設定します.契約を守る3.実装プロトコルメソッド
コード:実際のコードを見て、私たちは学生に従業員にプロトコルを制定するように要求しました.
    .h  
//            
#import <Foundation/Foundation.h>

//          
@protocol roomServer <NSObject>

@required//      
-(void)check;//    
@optional//        
-(void)tackClothes;//   
@end

@interface Student : NSObject
@property(assign,nonatomic)id<roomServer> delegate;//      ()     roomServer  //
-(void)serve;//    
@end

    .m  
#import "Student.h"

@implementation Student
@synthesize delegate;
-(void)serve{
    //  if             
    if ([self.delegate conformsToProtocol:@protocol(roomServer)]) {
        [self.delegate check];//       (  )        
        [self.delegate tackClothes];
    }
}
//         ,              
    .h
#import <Foundation/Foundation.h>
#import "Student.h"
@interface Waiter : NSObject <roomServer>//        

@end
    .m  
              
#import "Waiter.h"

@implementation Waiter
-(void)check
{
    NSLog(@"     ");
}
-(void)tackClothes
{
    NSLog(@"      ");
}
@end


main  
#import <Foundation/Foundation.h>
#import "Student.h"
#import "Waiter.h"
int main(int argc, const char * argv[])
{

    @autoreleasepool {

        Student *stu=[[Student alloc]init];// Student stu           
        Waiter *wa=[[Waiter alloc]init];// Waiter wa          
        stu.delegate=wa;//    stu                   
        [stu serve];
    }
    return 0;
}

概念理解エージェントとプロトコルの違い
エージェントは概念であり,プロトコルは技術であり,エージェントはプロトコルで実現され,エージェントは2つのオブジェクト間の通信の方式である.エージェントは主に逆転送を行います.scrollviewスライドイベント、写真選択、asiネットワークダウンロード完了など、システムのいくつかのコールバック方法を実現する.