2010-12-22 63 views
2

我以为在理解当前课程中的任何东西的同时,我理解了自我的使用。在遇到这个警告和随后的运行失败之后,我搜索了很多“定义自我”或“自我使用”的变体,并且无处可寻。这个问题是如何创建一个没有警告的对象,并理解为什么。如何使用自己创建对象?

#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  

注意,如果我代替Fooself,没有任何问题。我认为课程名称和自我是等价的,但显然编译器并不这么认为。

  1. 也许有什么错在这里不仅可以解决我的问题,但也开导我的self用法的理解的解释。

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

回答

7

self引用的消息的接收器,所以在这种具体情况中,self引用在其上-beta被调用的对象。 (在类方法的范围,self引用类的Class对象)

现在,因为在这种情况下self引用,该方法被调用的对象,编译器给你一个警告,因为new不是实例方法Foonew类方法继承自NSObject。因此,要做到这一点,正确的方法是从self检索Class对象,然后调用上new

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

+1很好的解释 – 2010-12-22 23:31:35

相关问题