Как создать объект, используя себя? - PullRequest
2 голосов
/ 23 декабря 2010

Мне показалось, что я поняла использование себя, когда говорила о чем-либо в текущем классе.После появления этого предупреждения и последующего сбоя прогона я гуглил много вариантов «определить себя» или «использование себя» и ничего не получил.Эта проблема заключается в том, как создать объект без предупреждения и понять, почему.

#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 является получателем сообщения», что мне совсем не помогло.

1 Ответ

7 голосов
/ 23 декабря 2010

self ссылается на получателя сообщения, поэтому в данном конкретном случае self ссылается на объект, для которого был вызван -beta.(В рамках метода класса self ссылается на объект класса 'Class)

Теперь, поскольку self в этом случае ссылается на объект, для которого был вызван метод, компилятор дает вампредупреждение, потому что new не является методом экземпляра Foo.new - это метод класса , унаследованный от NSObject.Таким образом, правильный способ сделать это - извлечь объект Class из self, а затем вызвать new для этого:

- (void) beta {  
  obj = [[self class] new];
}  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...