(1.) super「静的関数」には何がありますか? Objective-C では、+メソッドは適切にクラス メソッドと呼ばれ、-メソッドはインスタンス メソッドと呼ばれます。これらのメソッドは真の静的メソッドではありません。これは、Objective-C クラス自体がClassという不透明な型のオブジェクトであるためです。したがって、superとの両方selfが +methods で定義されます。MyGizmoClasssuperのスーパークラスにメッセージを送信しますが、 +method から呼び出されると同等の +method を探し、 -method から呼び出されると対応する -method を探します。+MyGizmoClass のメソッドで、クラスであるMyGizmoClassを返しますsupersuper
self、一方で -methodsselfはMyGizmoClassインスタンスへのポインターです。
(2.) メソッドは を+class返しますself.isa。Yesはスーパークラスの :メソッドを[super class]呼び出しますが、が +methods に渡されると、その値も型も変更されません (一方、の型は、-methods を介して渡されるとスーパークラスにキャストされます)。したがって、チェーンの上位にあるメソッドの実装が を要求すると、同じ値MyGizmoClassが取得されます。確かに、オーバーライドを配置できるMyGizmoSuperClassからMyGizmoClassを派生させることで、スーパークラスを呼び出すことを確認できます。+classselfself+classself.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]、スーパークラスのバージョンが呼び出されます。