我认为我在引用当前类中的任何内容时理解了self的用法。在遇到这个警告和随后的运行失败之后,我搜索了许多“定义自我”或“使用自我”的变种并且无处可去。这个问题是如何在没有警告的情况下创建对象,并理解原因。
#import <Cocoa/Cocoa.h>
@interface Foo : NSObject {
Foo *obj;
}
-(void)beta;
@end
#import "Foo.h"
@implementation Foo
-(void)beta{
obj = [self new]; // 'Foo' may not respond to '-new'
}
@end
注意,如果我将Foo
替换为self
,则没有问题。我认为类名和self是等价的,但显然编译器并不这么认为。
或许对这里的错误进行解释不仅可以解决我的问题,还可以启发我对self
用法的理解。
是否有关于正确使用self的教程?除了“self
是信息的接收者”之外,我找不到任何东西,这根本没有帮助我。
答案 0 :(得分:7)
self
引用消息的接收者,因此在这种特定情况下,self
引用调用-beta
的对象。 (在类方法的范围内,self
引用类“Class
对象”
现在,由于self
在这种情况下引用了调用该方法的对象,编译器会向您发出警告,因为new
不是Foo
的实例方法。 new
是从NSObject
继承的类方法。因此,正确的方法是从Class
检索self
对象,然后在其上调用new
:
- (void) beta {
obj = [[self class] new];
}