自我概念,如果我在类方法中使用self而不是实例方法

时间:2014-11-23 13:04:01

标签: objective-c ios7 ios5

@interface hello:SKScene
@end

@implementation hello

+(void)method{

    [self here];

}
@end

的main.m

[hello method];

这里,当我调用这个类方法而不为对象分配内存然后方法自己,属于谁? 我的问题是自己属于包含调用方法的类然后因为我没有定义对象然后,为什么我仍然可以在这上面使用self ?????

它仍然属于它所调用的类吗?请在实例方法和类方法上给我正确的自我概念。

2 个答案:

答案 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运行时自动创建。 (对你来说并不重要。)对于所有意图和目的,它是永久性的。没有必要对它进行管理。