如何使用self创建对象?

Nic*_*ick 2 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    
Run Code Online (Sandbox Code Playgroud)

请注意,如果我取代Fooself,没有任何问题.我认为类名和self是等价的,但显然编译器并不这么认为.

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

  2. 是否有关于正确使用自我的任何教程?我找不到任何东西,比如" self是信息的接收者",这根本没有帮助我.

Jac*_*kin 7

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

现在,因为self在这种情况下引用了调用该方法的对象,编译器会给出警告,因为new它不是实例方法Foo.new是一个继承自的类方法NSObject.所以,正确的方法是从中检索Class对象self,然后调用new:

- (void) beta {  
  obj = [[self class] new];
}  
Run Code Online (Sandbox Code Playgroud)