Objective-C Language
クラスとオブジェクト
サーチ…
構文
- Cat * cat = [[Cat alloc] init]; // Cat型のcatオブジェクトを作成する
- Dog * dog = [[Dog alloc] init]; // Dog型のdogオブジェクトを作成する
- NSObject * someObject = [NSObject alloc]; [someObject init]; //これをしない
- XYZObject *オブジェクト= [XYZObject new]; //初期化に引数が必要ない場合、newを使用してオブジェクトを作成する
- NSString * someString = @ "こんにちは、世界!"; // リテラル構文で NSStringを作成する
- NSNumber * myFloat = @ 3.14f; //リテラル構文を使用してNSNumberを作成する別の例
- NSNumber * myInt = @(84/2); //ボックス化された式を使用してオブジェクトを作成する
初期値を持つクラスの作成
#import <Foundation/Foundation.h>
@interface Car:NSObject {
NSString *CarMotorCode;
NSString *CarChassisCode;
}
- (instancetype)initWithMotorValue:(NSString *) motorCode andChassisValue:(NSInteger)chassisCode;
- (void) startCar;
- (void) stopCar;
@end
@implementation Car
- (instancetype)initWithMotorValue:(NSString *) motorCode andChassisValue:(NSInteger)chassisCode{
CarMotorCode = motorCode;
CarChassisCode = chassisCode;
return self;
}
- (void) startCar {...}
- (void) stopCar {...}
@end
メソッドinitWithMotorValue: type andChassisValue: type
は、Carオブジェクトを初期化するために使用されます。
シングルトンクラス
シングルトンクラスとは何ですか?
シングルトンクラスは、アプリケーションが要求した回数に関係なく同じインスタンスを返します。通常のクラスとは異なり、シングルトンオブジェクトはそのクラスのリソースへのグローバルアクセスポイントを提供します。
シングルトンクラスを使用する場合
シングルトンは、いくつかの一般的なサービスやリソースを提供するクラスなど、この単一のコントロールポイントが望ましい状況で使用されます。
シングルトンクラスを作成する方法
まず、新規ファイルを作成し、 NSObject
からそのファイルをサブクラス化します。名前を付けて、 CommonClass
ここで使用します。 XcodeはCommonClass.hとCommonClass.mファイルを生成します。
あなたのCommonClass.h
ファイル:
#import <Foundation/Foundation.h>
@interface CommonClass : NSObject {
}
+ (CommonClass *)sharedObject;
@property NSString *commonString;
@end
CommonClass.m
ファイルで:
#import "CommonClass.h"
@implementation CommonClass
+ (CommonClass *)sharedObject {
static CommonClass *sharedClass = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedClass = [[self alloc] init];
});
return sharedClass;
}
- (id)init {
if (self = [super init]) {
self.commonString = @"this is string";
}
return self;
}
@end
シングルトンクラスの使い方
先に作成したシングルトンクラスは、関連モジュールでCommonClass.h
ファイルをインポートしてCommonClass.h
ば、プロジェクトのどこからでもアクセスできます。シングルトンクラスの共有データを変更してアクセスするには、次のようにsharedObject
メソッドを使用してアクセスできる、そのクラスの共有オブジェクトにアクセスする必要があります。
[CommonClass sharedObject]
共有クラスの要素を読み取ったり変更したりするには、次のようにします。
NSString *commonString = [[CommonClass sharedObject].commonString; //Read the string in singleton class
NSString *newString = @"New String";
[CommonClass sharedObject].commonString = newString;//Modified the string in singleton class
"instancetype"戻り値の型
Objective-Cは `instancetype 'と呼ばれる特別な型をサポートしています。これはメソッドによって返される型としてのみ使用できます。それは受信オブジェクトのクラスに評価されます。
次のクラス階層を考えてみましょう。
@interface Foo : NSObject
- (instancetype)initWithString:(NSString *)string;
@end
@interface Bar : Foo
@end
[[Foo alloc] initWithString:@"abc"]
が呼び出されると、コンパイラは戻り値の型がFoo *
と推論することができます。 Bar
クラスはFoo
から派生しましたが、初期化子の宣言をオーバーライドしませんでした。しかし、 instancetype
おかげで、コンパイラは[[Bar alloc] initWithString:@"xyz"]
がBar *
型の値を返すと推論することができます。
戻り値の型を検討-[Foo initWithString:]
であることFoo *
の代わりに:あなたが呼ぶような場合[[Bar alloc] initWithString:]
、コンパイラがあることを推測うFoo *
返され、ないBar *
の意図であるとして開発者。 instancetype
この問題を解決しました。
instancetype
が導入される前に、イニシャライザ、シングルトンアクセサやその他のメソッドのような静的メソッドは、受信クラスのインスタンスを返す必要があり、 id
を返す必要がありました。問題は、 id
は"あらゆるタイプのオブジェクト"を意味するということです。したがってコンパイラはNSString *wrong = [[Foo alloc] initWithString:@"abc"];
を検出できませんNSString *wrong = [[Foo alloc] initWithString:@"abc"];
不正な型の変数に代入しています。
この問題のため、 イニシャライザは戻り値としてid
代わりに常にinstancetype
を使用する必要があります。
ジェネリックの指定
NSArray
やNSDictionary
ようなジェネリックで独自のクラスを拡張することができます。
@interface MyClass<__covariant T>
@property (nonnull, nonatomic, strong, readonly) NSArray<T>* allObjects;
- (void) addObject:(nonnull T)obj;
@end
割り当てと初期化の違い
ほとんどのオブジェクト指向言語では、オブジェクトのメモリを割り当てて初期化することは、基本的な操作です。
// Both allocates memory and calls the constructor
MyClass object = new MyClass();
Objective-Cでは、これらは別々の操作です。クラスメソッドalloc
(およびその歴史的な兄弟allocWithZone:
は、Objective-Cランタイムを必要なメモリを確保してクリアします。いくつかの内部値を除いて、すべてのプロパティと変数は0 / NO
/ nil
設定されます。
オブジェクトはすでに "有効"ですが、オブジェクトを実際に設定するメソッドを呼び出す必要があります 。これをイニシャライザと呼びます 。これらは他の言語のコンストラクタと同じ目的を果たします。慣例により、これらのメソッドはinit
始まりinit
。言葉の観点から言えば、それは単なる正常な方法です。
// Allocate memory and set all properties and variables to 0/NO/nil.
MyClass *object = [MyClass alloc];
// Initialize the object.
object = [object init];
// Shorthand:
object = [[MyClass alloc] init];