如何使用self创建对象?

时间:2010-12-22 22:31:09

标签: objective-c

我认为我在引用当前类中的任何内容时理解了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是等价的,但显然编译器并不这么认为。

  1. 或许对这里的错误进行解释不仅可以解决我的问题,还可以启发我对self用法的理解。

  2. 是否有关于正确使用self的教程?除了“self是信息的接收者”之外,我找不到任何东西,这根本没有帮助我。

1 个答案:

答案 0 :(得分:7)

self引用消息的接收者,因此在这种特定情况下,self引用调用-beta的对象。 (在类方法的范围内,self引用类“Class对象”

现在,由于self在这种情况下引用了调用该方法的对象,编译器会向您发出警告,因为new不是Foo的实例方法。 new是从NSObject继承的类方法。因此,正确的方法是从Class检索self对象,然后在其上调用new

- (void) beta {  
  obj = [[self class] new];
}