【Objective-Cノート】——対象2

4109 ワード

インスタンス変数


クラスのインスタンス変数を宣言する場合は、対応する宣言をカッコに書き、クラス宣言の直後に続く必要があります.各インスタンス変数は下線_で始まり、次にUItem.hItemクラス宣言の4つのインスタンス変数です.
#import 

@interface UItem : NSObject
{
    NSString *_itemName;
    NSString *_serialNumber;
    int _valueInDollars;
    NSDate *_dateCreated;
}
@end

*対応する変数ポインタを表します.上には3つのオブジェクトを格納するポインタ変数があります.

アクセスインスタンス変数

  • 格納方法:インスタンス変数の変数名の前にset
  • を付ける
  • 取方法:直接変数名
  • UItem.h
    #import 
    
    @interface UItem : NSObject
    {
        NSString *_itemName;
    }
    
    - (void) setItemName: (NSString *) str;
    - (NSString *) itemName;
    @end
    
    UItem.m
    #import "UItem.h"
    
    @implementation UItem
    
    - (void) setItemName: (NSString *) str {
        _itemName = str;
    }
    - (NSString *) itemName {
        return _itemName;
    }
    
    @end
    

    ポイント構文を使用したインスタンス変数へのアクセス

    main.m
    #import 
    #import "UItem.h"
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            UItem *item = [[UItem alloc] init];
            item.itemName = @"u14e";     //  setItemName 
            
            NSString *name = item.itemName;      //  itemName 
        }
        return 0;
    }
    

    クラスメソッドとインスタンスメソッド


    クラスメソッドは、通常、オブジェクトを作成したり、クラスのグローバル属性を取得したりするために使用されます.オブジェクトには作用しません.インスタンスオブジェクトにもアクセスできません.クラスによって直接呼び出されます.
    インスタンスメソッドはオブジェクトによって呼び出されます
    eg.[[UItem alloc] init]allocはクラス呼び出し(クラスメソッド)、initはオブジェクト呼び出し(インスタンスメソッド).メソッドを宣言する場合、クラスメソッドの戻りタイプの前に文字+があり、インスタンスメソッドは-であり、例えば+ (instancetype)alloc- (instancetype)init

    初期化方法


    各初期化メソッドのメソッド名はinitで始まり、以下の2つの初期化メソッドがあります.
    @interface UItem : NSObject
    {
        NSString *_itemName;
        NSString *_serialNumber;
        int _valueInDollars;
        NSDate *_dateCreated;
    }
    
    - (instancetype) initWithItemName: (NSString *) name
                       valueInDollars: (int) value
                         serialNumber: (NSString *) sNum;
    
    - (instancetype) initWithItemName: (NSString *) name;
    
    - (void) setItemName: (NSString *) str;
    - (NSString *) itemName;
    @end
    

    初期化方法の指定


    いずれのクラスにおいても、いくつの初期化方法があるも、いずれかを指定の初期化方法として選択する必要がある.初期化方法を指定するパラメータは、通常、最も重要な、最も一般的なインスタンス変数に対応する.
    // UItem 
    - (instancetype) initWithItemName: (NSString *) name
                       valueInDollars: (int) value
                         serialNumber: (NSString *) sNum;
    
    - (instancetype) initWithItemName: (NSString *) name;
    

    义齿

    instancetypeメソッドの戻りタイプと呼び出しメソッドのオブジェクトタイプが同じidは、任意のオブジェクトへのポインタを表し、変数名に*を付けることはできません.
    以下、idの運用:
    NSMutableArray *items = [[NSMutableArray alloc] init];
    items[0] = @"one";
    items[1] = @"two";
    items[2] = @123;      //  Objective-C , C ,nil 
    
    for (id item in items) {
        NSLog(@"%@", item);
    }
    

    実装クラスの指定初期化方法

    - (instancetype) initWithItemName:(NSString *)name
                       valueInDollars:(int)value
                         serialNumber:(NSString *)sNum {
        self = [super init];
        
        if (self) {
            _itemName = name;
            _serialNumber = sNum;
            _valueInDollars = value;
            _dateCreated = [[NSDate alloc] init];
        }
        
        return self;
    }
    

    selfは、メッセージを受信したオブジェクト自体を指す
    - (void) someMethod {
        [super someMethod];
        [self doMoreStuff];
    }
    

    superは親から継承するメソッドで、親のsomeMethodを実行し、それに基づいて子クラスの実装を拡張します.
    クラスの他のインスタンスメソッドではインスタンス変数に直接アクセスしないでください.ただし、クラスの初期化メソッドでは、インスタンス変数に直接アクセスする必要があります.

    その他の初期化メソッドの実装(指定された初期化メソッドに基づく)

    - (instancetype) initWithItemName:(NSString *)name {
        return [self initWithItemName:name
                       valueInDollars:0
                         serialNumber:@""];
    }
    
    - (instancetype) init {
        return [self initWithItemName:@"Item"];
    }