@interface hello:SKScene
@end
@implementation hello
+(void)method{
[self here];
}
@end
的main.m
[hello method];
这里,当我调用这个类方法而不为对象分配内存然后方法自己,属于谁? 我的问题是自己属于包含调用方法的类然后因为我没有定义对象然后,为什么我仍然可以在这上面使用self ?????
它仍然属于它所调用的类吗?请在实例方法和类方法上给我正确的自我概念。
答案 0 :(得分:2)
当您在类方法中引用self
时,self
指的是类本身,而不是该类的特定实例。通过在这些类方法中使用self
而不是实际的类名,可以更容易地对相关类进行子类化。具体来说,类方法将被继承,但self
引用现在将引用子类而不是基类。如果您按名称引用基类,则不会这样。
考虑这种工厂方法:
@implementation BaseClassObject
// THIS IS WRONG
+ (BaseClassObject *)object {
return [[BaseClassObject alloc] init];
}
@end
考虑这个子类:
@interface SubClassObject : BaseClassObject
@end
然后考虑这样做的代码:
SubClassObject *object = [SubClassObject object]; // WRONG
问题是object
工厂方法将返回BaseClassObject
而不是SubClassObject
。但是,如果我们改变工厂类方法的定义以使用self
:
@implementation BaseClassObject
// THIS IS RIGHT
+ (instancetype)object {
return [[self alloc] init];
}
@end
现在,当我引用[SubClassObject object]
时,我将获得SubClassObject
而不是BaseClassObject
的实例。
注意:在我设计的示例中,使用self
非常重要。但是,您可能遇到似乎没有立即相关的代码(例如,您可能有一个基类,但此时没有子类)。
即使在这种情况下,你可能应该养成在这些类方法中使用self
的习惯,无论是对于未来的"你的代码,所以如果你将来在某个不可预见的日期继承这个基类,这些类方法即使在子类化时也更有可能正常运行。
答案 1 :(得分:0)
只是为Rob的答案添加一点:类对象由编译器和/或Objective-C运行时自动创建。 (对你来说并不重要。)对于所有意图和目的,它是永久性的。没有必要对它进行管理。