我在这里读了一个主题 http://www.mikeash.com/pyblog/friday-qa-2010-05-14-what-every-apple-programmer-should-know.html。 Mike说:“在调用你自己的类方法时总是使用[self class]”。但我不明白为什么。你能给个例子吗 ?为什么在调用自己的类方法时需要使用[self class]?
回答
比方说,你有一流的foo
,它有以下几种方法:
+(NSString*) bar{ return @"bar"; }
-(NSString*) barMethod{ return [[self class] bar]; }
现在让我们说你有一个类foo2
从foo
继承。如果重写
+(NSString*) bar { return @"bar2" }
方法barMethod
将返回bar2
,因为你可能打算为它。
与其他OO语言不同,Objective-C中的类方法都是继承的,可以覆盖。
因此,如果您有:
@immplementation Abstract // : NSObject
- (void) doSomethingClassy
{
[Abstract classyThing];
}
+ (void) classyThing
{
... some classy code ...;
}
@end
@interface Concrete : Abstract
@end
@implementation Concrete
+ (void) classyThing
{
... some classy code ...;
[super classThing];
}
@end
那么这会不会致电混凝土的+classyThing
从抽象的实施doSomethingClassy
:
[[[Concrete alloc] init] doSomethingClassy];
如果修改doSomethingClassy
而做[[self class] classyThing];
它会工作如预期。
(注意,这是立业张的回答一个具体的例子 - 随意纪念他正确的,因为他是第一次,只是没有用很为例混凝土)
结果似乎是相同的(从我刚刚运行的一些测试),无论你是做[[self class] someClassMethod]还是'[self someClassMethod]'。所以我没有看到使用'[self class]'而不是'self'来调用类方法。 – rmaddy
@rmaddy在类方法中,由于'+ [NSObject class]'被定义为'return self',所以不论你说'self'还是'[self class]'都没关系。在一个实例方法中,你必须说'[self class]'。 –
@robmayoff谢谢。我明白了。但是仍然不清楚为什么要在类方法中选择'[self class] someClassMethod]''over'[some someClassMethod]'。如果您更改将方法调用为实例方法的类方法,唯一的原因是什么? – rmaddy
- 1. 为什么Self被调用来访问类自己的属性?
- 2. 为什么“[self class] == [super class]”?
- 3. 使用类创建对象,为什么我需要__init __(self,args):?
- 4. 为什么要在初始化方法中检查[self class] == [LevelAppDelegate类]?
- 5. 为什么'self'需要从其构造函数中调用Ruby方法?
- 6. 为什么Microsoft为自己的类使用扩展方法?
- 7. 为什么需要使用'addChildViewController:'方法
- 8. 为什么我们需要System类来调用out.println()方法?
- 9. 为什么Java的invokevirtual需要解析被调用方法的编译时类?
- 10. 为什么“class << self”中的自我是指类?
- 11. 为什么我们需要在调用方法时使用关键字
- 12. 为什么在我的Rails模型中赋值时需要使用self?
- 13. main方法中使用的方法是否需要自己的类?
- 14. 为什么我们需要在Javascript中的类中使用“var self = this”?
- 15. 为什么ActiveRecord回调需要使用self关键字作为前缀的实例变量或实例方法?
- 16. 调用方法NodeJS/ES6中的类调用自己的方法
- 17. 为什么getResourceAsStream方法在Class类中?
- 18. 为什么我的超类在Swift中调用子类的方法而不是自己的方法?
- 19. 为什么要在python中使用类方法实例方法
- 20. 调用自己的方法时出错
- 21. 为什么在ruby中使用class << self?
- 22. 为什么Python需要“self”参数?
- 23. 为什么在使用MessageToByteEncoder时需要调用ctx.writeAndFlush
- 24. 为什么Twig在使用自定义视图助手时需要__invoke方法?
- 25. 为什么在调用类方法之前通过+(Class)类发送一个类?
- 26. 为什么在有完美的父类方法时需要这些类方法?
- 27. 为什么在采用类型为“Self”的属性的协议时类需要“最终”?
- 28. php:何时需要使用self :: method()?
- 29. 为什么需要Thread .__ init __()在Class中?
- 30. 方法需要明确的`self`说法
我不知道,如果你的问题源于对[类方法](http://developer.apple.com/library/ios/#documentation/general/conceptual/DevPedia-CocoaCore/ClassMethod.html)是什么的缺乏清晰度,即那些实现它们的方法以'+'开始,用于类,而不是用于该类的对象的特定实例,而不是用于更频繁地看到的实例方法(实现以'-'开头的那些方法),或者是否有问题关于使用'[self class]'构造的使用。 – Rob
我的意思是为什么使用'[[self class] method]'而不是'[className method]' – DungLe
啊。如果你的对象已被子类化,并且你可能想要使用方法的子类再现,那么这很有用,所以你可以享受子类的完整行为,即使用子类中'method'的版本。 – Rob