【Objective-Cノート】——対象2
4109 ワード
インスタンス変数
クラスのインスタンス変数を宣言する場合は、対応する宣言をカッコに書き、クラス宣言の直後に続く必要があります.各インスタンス変数は下線
_
で始まり、次にUItem.h
でItem
クラス宣言の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"];
}