[Effective OC]第1章OCに詳しい

3071 ワード

きそ
  • OCはメッセージ型言語、Cは関数呼び出し型
  • メッセージ型言語、動的バインド(dynamicbinding)、実行時に実行されるコードは、実行時コンポーネントによって決定され、実行時にオブジェクトタイプ
  • がチェックされる.
  • ランタイムコンポーネントは本質的に開発者が作成したコードにリンクされたダイナミックライブラリであり、そのコードは開発者が作成したすべてのプログラムを
  • に接着することができる.
  • オブジェクトが占めるメモリは「ヒープ」に割り当てられ、ポインタが占めるメモリは「スタック」に割り当てられ、構造体もスタックに割り当てられる
  • .
  • は、オブジェクトがメモリの割り当てやメモリの解放などのオーバーヘッドを必要とするため、オブジェクトよりも構造体を使用する方がパフォーマンスを節約する
  • である.
    ポイント
  • 在.hファイルでは他のヘッダファイルの参照をできるだけ少なくし、コンパイル時間を短縮し、参照サイクルを回避する
  • 属性のみを宣言する場合は、@class(順方向宣言、forward declearing)を使用し、遵守するプロトコルを宣言する必要がある場合は、クラス拡張で
  • を宣言できます.
  • プロトコルは、1つのファイルに単独で配置することが望ましい.1つのクラスに配置すると、プロトコルを参照するには、このクラスを導入する必要があり、コンパイル時間
  • が増加する.
  • 多用タイプ定数少用#define前処理コマンド.タイプ定数の意味はより明確であり、コマンドの不要な置換を前処理することができる(#defineはコマンドヘッダファイルを含むすべてのファイルを導入することに影響する)
  • .
    .h
    #import 
    // const     ,    
    // static            
    // extern       ,        (global symbol table)
    // !!!           .h    ,  .m    ,         ,         !!!
    extern const NSInteger  ZWQConstantNumber;  // .h           
    @interface ZWQConstant : NSObject
    @end
    
    .m
    #import "ZWQConstant.h"
    static const NSString *kName = @"ZWQ";  //         
    const NSInteger ZWQConstantNumber = 1;  //  .m           
    @implementation ZWQConstant
    @end
    
  • 列挙
  • は、列挙を使用して状態、オプション
  • を表す.
  • オプションを列挙して定義する場合、オプションが組み合わせることができる場合、オプションは2のべき乗
  • に定義される.
    #import 
    //         、   、  
    //         ,      2  ,  “|”     ,  “&”     
    //           NS_OPTIONS,           NS_ENUM
    //   switch()            ,     default   ,          ,         switch   
    
    //       (     ,   NS_ENUM)
    typedef NS_ENUM(NSUInteger,ZWQOption){
        ZWQOptionA, // 0
        ZWQOptionB, // 1
        ZWQOptionC, // 2
    } ;
    //     (     ,   NS_ENUM)
    typedef NS_ENUM(NSUInteger,ZWQState){
        ZWQStateA = 100,
        ZWQStateB = 200,
        ZWQStateC = 300,
    } ;
    //      ,   2  ,  “|”     ,  “&”     (    ,   NS_OPTIONS)
    typedef NS_OPTIONS(NSUInteger,ZWQDirection){
        ZWQDirectionUp = 1 << 0,
        ZWQDirectionDown = 1 << 1,
        ZWQDirectionLeft = 1 << 2,
        ZWQDirectionRight = 1 << 3
    } ;
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            //   switch      
            ZWQOption option = ZWQOptionA;
            switch (option) {
                case ZWQOptionA:
                    NSLog(@"%@",@"ZWQOptionA");
                    break;
                case ZWQOptionB:
                    NSLog(@"%@",@"ZWQOptionB");
                    break;
                case ZWQOptionC:
                    NSLog(@"%@",@"ZWQOptionC");
                    break;
            }
            
            //         
            ZWQDirection direction = ZWQDirectionUp | ZWQDirectionDown | ZWQDirectionLeft | ZWQDirectionRight;
            if ( (direction & ZWQDirectionUp) && (direction & ZWQDirectionDown) && (direction & ZWQDirectionLeft ) && (direction & ZWQDirectionRight) ) {
                NSLog(@"%@",@"    ");
            }
        }
        return 0;
    }