(1.) super
「静的関数」には何がありますか? Objective-C では、+メソッドは適切にクラス メソッドと呼ばれ、-メソッドはインスタンス メソッドと呼ばれます。これらのメソッドは真の静的メソッドではありません。これは、Objective-C クラス自体がClassという不透明な型のオブジェクトであるためです。したがって、super
との両方self
が +methods で定義されます。MyGizmoClasssuper
のスーパークラスにメッセージを送信しますが、 +method から呼び出されると同等の +method を探し、 -method から呼び出されると対応する -method を探します。+MyGizmoClass のメソッドで、クラスであるMyGizmoClassを返しますsuper
super
self
、一方で -methodsself
はMyGizmoClassインスタンスへのポインターです。
(2.) メソッドは を+class
返しますself.isa
。Yesはスーパークラスの :メソッドを[super class]
呼び出しますが、が +methods に渡されると、その値も型も変更されません (一方、の型は、-methods を介して渡されるとスーパークラスにキャストされます)。したがって、チェーンの上位にあるメソッドの実装が を要求すると、同じ値MyGizmoClassが取得されます。確かに、オーバーライドを配置できるMyGizmoSuperClassからMyGizmoClassを派生させることで、スーパークラスを呼び出すことを確認できます。+class
self
self
+class
self.isa
super
+class
@interface MyGizmoSuperClass : NSObject
@end
@implementation MyGizmoSuperClass
+(Class) class {
NSLog(@"yes it calls MyGizmoSuperClass:class");
return [super class];
}
@end
@interface MyGizmoClass : MyGizmoSuperClass
+(Class) classviasuper;
@end
@implementation MyGizmoClass
+(Class) classviasuper {
return [super class]; //which version of class will super call?
}
@end
int main(int argc, char *argv[])
{
NSLog(@"returned %@",[MyGizmoClass classviasuper]);
}
版画
はい、それは MyGizmoSuperClass を呼び出します:クラス
は MyGizmoClass を返しました
(3.)super
のスーパークラス バージョンを再度呼び出しますallocWithZone
がself
、メソッドに渡される値は引き続きMyGizmoClassを指し、allocWithZone
レシーバーのクラスのオブジェクトを返すため、MyGizmoClassが返されます。
super
(4.)が と異なることを簡単に確認できますself
。[self allocWithZone:NULL]
コードを実装すると、 MyGizmoClassの実装が呼び出され、allocWithZone
無期限にループします。では[super allocWithZone:NULL]
、スーパークラスのバージョンが呼び出されます。