OCの構造方法と分類知識点のまとめ

6808 ワード

OC言語の構造方法:
 
オブジェクトを初期化する方法、オブジェクト方法、マイナス記号で開始します.
オブジェクトを作成するためには、メンバー変数に固定された値があります.
構造方法を書き換える注意点:
親類の構造方法を先に呼び出します([super init])
サブクラスの内部メンバー変数の初期化を行います.
参考:http://www.codes51.com/article/detail_111604.
構造方法の呼び出し:
完全に利用可能なオブジェクトを作成します.Person*p=[Person new]Newメソッドの内部では、2つの方法をそれぞれ呼び出して、2つの事柄を完成させます.
1)alloc方法を使用して記憶空間を割り当てる(割り当てられたオブジェクトに戻る).
2)init方法を用いて対象を初期化する.newメソッドを分解してもいいです.1.クラスメソッド+allocは格納空間を割り当てて、初期化されていないオブジェクトPerson*p 1=[person]に戻ります. alloc;;2.対象方法-initを呼び出して初期化し、対象自体のPerson*p 2=[p 1 init]に戻る.3.上記二つのプロセスは一つの文に統合されています.Person*p=[Person alloc]init;説明:init方法とは、構造方法であり、対象を初期化するための方法であり、対象の方法であり、マイナス記号の先頭であることに注意する.デフォルトの初期化が完了すると、すべてのメンバー変数の値が0になります.
たとえば:
Person.h
 
#import <Foundation/Foundation.h>



@interface Person : NSObject

@property int age;

@end

 
 
Person.m
 
#import "Person.h"



@implementation Person





//   -init  

//- (id)init

//{

//    // 1.      super init  :                    

//    self = [super init]; //      self

//    

//    

//    // 2.         ,             

//    if (self != nil)

//    { //      

//        _age = 10;

//    }

//    

//    // 3.              

//    return self;

//}



- (id)init

{

    if ( self = [super init] )

    { //      

        _age = 10;

    }

    

    // 3.              

    return self;

}



@end

メーン.m
 
 
#import <Foundation/Foundation.h>

#import "Person.h"

#import "Student.h"



//     :          ,      ,-  

//          :         ,             

/*

           

1.          ([super init])

2.               

 */

int main()

{

    // Person *p = [Person new];

    /*

                 

     1.        +alloc

     2.    -init

     */

    

    // 1.  +alloc      

    // Person *p1 = [Person alloc];

    // 2.  -init     

    // Person *p2 = [p1 init];

    

//    //   -init     

//    Person *p3 = [Person new];

//    

//    

//    //   Person      ,  _age  10

//    

    

    Person *p4 = [[Person alloc] init];

    

    

    Student *stu = [[Student alloc] init];

    

    NSLog(@"------");

    

    return 0;

}

構造方法は注意(1)サブクラスが持つメンバー変数を使用して、自分のメンバー変数と親クラスから引き継ぐメンバー変数を含み、構造方法を書き換える際には、まず親クラスから引き継ぐメンバー変数を初期化します.(2)原則:父類を初期化してから、初期化する.(3)構造方法を書き換える目的:オブジェクトメソッドを作成すると、メンバー変数に一定の値があります.(4)注意点:
 
1、親類の構造方法[super init]を先に呼び出します. 
2、サブクラスの内部メンバー変数の初期化を行います.
カスタム構造方法:
カスタム構造方法の仕様:(1)は必ず対象となります.マイナス記号で始まる(2)戻り値は一般的にidタイプ(3)メソッド名で、initwithで始まるのが一般的です.
カスタム構造方法例:
Person.h
 
#import <Foundation/Foundation.h>



@interface Person : NSObject

@property NSString *name;

@property int age;



/*

           

 1.       ,    -   

 2.      id  

 3.      initWith  

*/



- (id)initWithName:(NSString *)name;



- (id)initWithAge:(int)age;



// initWithName:andAge:

- (id)initWithName:(NSString *)name andAge:(int)age;



@end

Person.m
 
 
#import "Person.h"



@implementation Person



- (id)init

{

    if ( self = [super init] )

    {

        _name = @"Jack";

    }

    return self;

}



- (id)initWithName:(NSString*)name

{



    if ( self = [super init] )

    {

        _name = name;

    }

    

    return self;

}



- (id)initWithAge:(int)age

{

    if ( self = [super init] )

    {

        _age = age;

    }

    return self;

}



- (id)initWithName:(NSString *)name andAge:(int)age

{

    if ( self = [super init] )

    {

        _name = name;

        _age = age;

    }

    return self;

}



@end

対応メールアドレス
 
#import <Foundation/Foundation.h>

#import "Person.h"

#import "Student.h"



int main(int argc, const char * argv[])

{



    @autoreleasepool {

        Student *p = [[Student alloc] initWithName:@"Jim" andAge:29 andNo:10];

        NSLog(@"00000");

    }

    return 0;

}
カスタム構造方法の使用上の注意:(1)自分で自分のことをする(2)親の方法を親に渡す方法で、サブクラスの方法で独自の属性を扱う.
 
 
メンバー変数のスコープ:@public
どこでもオブジェクトに直接アクセスできるメンバー変数
@prvate
現在のクラスのオブジェクトメソッドにのみアクセスできます.
@protected(書かなくてもいいです.黙認してもいいです.)
現在のクラスとサブクラスの対象方法で直接アクセスできます.
@package
同じフレームにいる限り、オブジェクトのメンバー変数に直接アクセスすることができます.
@interfaceと@implemenationでは同名のメンバー変数は宣言できません.
@implementで変数を宣言します.デフォルトは@prvateです.
 
分類-Category:
分類は、元のモデルを変えないで、ある種類にいくつかの方法を拡張することができます.
分類は方法だけ追加できます.メンバー変数は追加できません.
分類方法の実装では、元のクラスで宣言されたメンバー変数にアクセスできます.
分類の優先度が一番高くて、方法は優先的に分類の中で探して、元の種類の中で探して、最後に父の種類の中で探します.
分類は元の種類の方法を書き換えることができますが、上書きします.元の方法が無効になり、再利用できません.
メソッドコールの優先度:クラス分け(最後にコンパイルに参加するカテゴリ優先)>>親クラス
分類の応用は一般的にNSString類を拡張する方法のようなシステムのクラスを拡張する方法である.
 
書式:
	     

@interface    (    )

//     

@end

?	     

@implementation    (    )

//     

@end

利点:
 
巨大なクラスはモジュールに分けて開発できます.
一つの巨大な種類は複数の人によって編纂され、チームワークにもいいです.
システムに持っているクラスに分類を追加します.
NSStringに、ある文字列のアラビア数字の個数を計算する方法を追加します.
NSStringにオブジェクトを追加します.現在の文字列のアラビア数字の個数を計算します.
 
注意:
Categoryは元のクラスのインスタンス変数にアクセスできますが、変数を追加することはできません.方法を追加するしかありません.変数を追加したい場合は、サブクラスの作成を引き継ぐことで考慮できます.
Categoryは原始的な方法を実現することができますが、それを推奨しません.元の方法をそのまま置き換えることですので、二度と元の方法に訪問することはできません.
複数のCategoryの中で同じ方法が実現されれば、最後のコンパイルに参加するだけで効果的です.
カテゴリの例:
メーン.m
 
/*

      :             ,          

 

     :

 1.        ,        

 2.                      

 3.               ,           ,             

 4.        :  (           ) -->      -->   

 */

#import <Foundation/Foundation.h>

#import "Person.h"

#import "Person+MJ.h"

#import "Person+JJ.h"



int main()

{

    Person *p = [[Person alloc] init];

    //p.age = 10;

    

    //         ,         ,        

    [p test];

   // [p study];

    

    return 0;

}

Person.h
 
 
/*

      :             ,          

 

     :

 1.        ,        

 2.                      

 3.               ,           ,             

 4.        :  (           ) -->      -->   

 */

#import <Foundation/Foundation.h>

#import "Person.h"

#import "Person+MJ.h"

#import "Person+JJ.h"



int main()

{

    Person *p = [[Person alloc] init];

    //p.age = 10;

    

    //         ,         ,        

    [p test];

   // [p study];

    

    return 0;

}

 
 
Person.m
 
#import "Person.h"



@implementation Person

- (void)test

{

    NSLog(@"Person-test");

}

@end