2011-12-17 1 views
3

Угадайте, это простой вопрос, но после поиска в Интернете и чтения во многих документах я все еще придерживаюсь глупой ошибки. Так что я думаю, у меня есть некоторые проблемы с разучиванием в соответствии с ARC ...Почему я вижу проблему с ARC, говоря, что я объявлял метод с определенным селектором?

Я пытаюсь написать свою первую программу Objective-C с использованием новых функций ARC. Как я привык, я создал два объекта и попытаюсь вызвать метод в одном объекте из другого. Я сделал это в старых Xcode тысячи раз, что путь, но с ARC, он бросает ошибки на меня:

//ClassOne.h 
@interface ClassOne : SPSprite 
{ 
    SPImage *stammImg;  
} 
-(void)methodToCall:(NSString*)msgString; 
@end 

//ClassOne.m 
-(void)methodToCall:(NSString*)msgString 
{ 
    NSLog(@"called, thank you"); 
} 

//ClassTwo.h 
#import "ClassOne.h" 

// somewhere in ClassTwo.m 
ClassOne *myObject = [[ClassOne alloc] init]; 
[myObject methodToCall:@"hello"]; 

Легко, не так ли? Но это не работает! Что изменилось в методе определения и вызова при создании нового проекта с использованием ARC?

Компилятор бросает ошибку:

Автоматический выпуск подсчета ссылок: ошибка: тип приемника 'SPSprite', например, сообщения, не объявляет метод с селектором 'methodToCall:' [4]

Редактировать: проверено все входы о SPSprite или верхнем корпусе. Отлично. Угадайте что: Если я отключить ARC в сборки-настройки, все работает отлично ...

Guess будет легко ответить для кого-то уже кодирование с использованием ARC ...

+1

Ваш код, как показано на самом деле не отражают проблему, которую вы имеете, так как она не включает в себя класс SPSprite. Если вы хотите получить помощь по вашей фактической проблеме, было бы лучше показать ваш фактический код. – matt

+0

Его проблема заключается только в опечатке верхнего/нижнего регистра в '[[classOne alloc] init]'. Это исправление кода будет работать очень хорошо, учитывая, что SPSprite существует, как указывает @matt. – Pascal

+0

SPSPrite - это класс рамки воробья, который я использую для своих игр ... мой ClassOne только подклассифицирует его. Угадайте, это не имеет значения, так как я не делал никаких изменений к нему? – skywise

ответ

3

Ничто не изменилось в ме- Определение и вызов при создании нового проекта с использованием ARC?

Проблема в вашем тесте, вероятно, SPSprite. Если я изменю SPSprite на NSObject, код компилируется и работает нормально.

ARC полагается на соглашения об именах. Хотя это не имеет никакого значения в этом примере, соглашения об именах заключаются в том, что имена классов начинаются с буквы верхнего регистра, поэтому classOne будет лучше, чем ClassOne.

Тест:

@interface ClassOne : NSObject { 
    NSObject *stammImg; 
} 

-(void)methodToCall:(NSString*)msgString; 
@end 

@implementation ClassOne 
-(void)methodToCall:(NSString*)msgString { 
    NSLog(@"called, thank you"); 
} 
@end 

@implementation AppDelegate 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    ClassOne *myObject = [[ClassOne alloc] init]; 
    [myObject methodToCall:@"hello"]; 

    return YES; 
} 

NSLog выход:

called, thank you 
+0

Спасибо за ваш ответ! К несчастью, я все еще застрял; Я перепроверял Case-Sensitive-Naming - все классы начинаются с UpperCase, так что дело не в этом. Я даже изменил Sub-Classing на обычный NSObject; Конечно, это не может быть решением вообще, потому что мой объект должен быть SPSprite (который, кроме того, определяется как: NSObject) для выполнения его работы, nsobject здесь не будет полезен. Кажется, что это не работает, когда определено как nsobject (и прокомментировал весь код, связанный с спрайтом). – skywise

+0

Вы должны изменить свой пример в соответствии с вашим предложением использовать имена верхнего регистра, а не наоборот. ;) – Pascal

+0

@Pascal Хорошее предложение, сделано. – zaph

Смежные вопросы