関連する戻り値の型と関連しない戻り値の型
- 関連性の戻り値の型
Cocoa の命名規則によれば、次の規則を満たすメソッドは次のとおりです。
(1) クラス メソッドでは、alloc または new で始まります。
(2) インスタンス メソッドでは、autorelease、init、retain、または self で始まり、
クラス タイプのオブジェクトを返します。メソッドが見つかりました。これらのメソッドは、関連付けられた戻り値の型を持つメソッドと呼ばれます。つまり、これらのメソッドの戻り結果の型は、メソッドが配置されているクラスになります。
例えば:
@interface NSObject
+ (id)alloc;
- (id)init;
@end
[NSArray alloc] と [[NSArray alloc]init] はどちらも NSArray オブジェクトを返します。
- 非結合戻り値の型
@interface NSArray
+ (id)constructAnArray;
@end
[NSArray constructAnArray];
Cocoa のメソッド命名規則によれば、取得される戻り値の型は、メソッドによって宣言された戻り値の型 (id) と同じです。
ただし、戻り値の型としてinstancetypeを使用する場合は、次のようになります。
@interface NSArray
+ (instancetype)constructAnArray;
@end
/
[NSArray constructAnArray];
このとき、戻り値の型はメソッドの型と同じになります。
instancetype の機能は、関連付けられていない戻り値の型を持つメソッドが、そのメソッドが属しているクラスの型を返すようにすることです。
両者の違い
-
ID はコンパイル中にオブジェクトの真のタイプを判断できません。
instancetype は、コンパイル中にオブジェクトの真のタイプを決定できます。
-
init メソッドの戻り値がinstancetypeの場合、その戻り値を別のオブジェクトに割り当てると警告が報告されます。
以前は、init の戻り値が id だった場合、init によって返されたオブジェクト アドレスが他のオブジェクトに割り当てられていても、エラーは報告されませんでした。
-
ID は、定義された変数、戻り値、または仮パラメータとして使用できます。ただし、instancetype は戻り値としてのみ使用できます。