2013-11-14 4 views
5

Вот мой TextValidator класс:IOS ошибки: Нет видимых @interface для «хххх» заявляет селектор «Alloc»

//TextValidator.h 
#import <Foundation/Foundation.h> 

@interface TextValidator : NSObject 
- (BOOL) isValidPassword:(NSString *)checkPassword; 
- (BOOL) isValidEmail:(NSString *)checkString; 
- (BOOL) isEmpty:(NSString *)checkString; 
@end 


// TextValidator.m 
#import "TextValidator.h" 

@implementation TextValidator 

- (BOOL) isEmpty:(NSString *)checkString 
{ 
    return YES; 
} 

- (BOOL) isValidPassword:(NSString *)checkPassword 
{ 
return YES; 
} 

- (BOOL) isValidEmail:(NSString *)checkString 
{ 
return YES; 
} 

@end 

Это способ, которым я пытаюсь инициализировать класс TextValidator в ViewController.m:

//ViewController.h 
#import <Foundation/Foundation.h> 

@interface SignUpViewController : UIViewController <UITextFieldDelegate> 
@end 

//ViewController.m 
#import "SignUpViewController.h" 
#import "TextValidator.h" 

@interface SignUpViewController() 

@property TextValidator *myValidator; 

@end 

@implementation SignUpViewController 

- (void)viewDidLoad 
{ 
    [[self.myValidator alloc] init]; //iOS error: No visible @interface for 'TextValidator' declares the selector 'alloc'* 
    [super viewDidLoad]; 
} 
@end 

Когда я пытаюсь скомпилировать код, я получаю следующее сообщение об ошибке:

No visible @interface for 'TextValidator' declares the selector 'alloc'. 

TextValidator класса inhe rits из NSObject, и насколько я знаю, функции init и alloc уже определены в базовом классе. Так почему же программа дает такую ​​ошибку?

Обратите внимание, что я уже проверил тему this и не работает для меня.

ответ

14

Мой психический отладчик, не читая ваш код, сообщает, что вы вызываете alloc на объект экземпляр, а не класс. Метод alloc представляет собой статический метод, определяемый классами (обычно унаследованный от NSObject), который возвращает новый экземпляр базового объекта. Вы не можете попросить экземпляр выделить себя!

Теперь, глядя на код, я вижу, что вы хотите:

self.myValidator = [[TextValidator alloc] init]; 

построить новый экземпляр, и назначить его myValidator собственности.

1

Ваш синтаксис создания объекта неверен. Правильный код:

self.myValidator = [[TextValidator alloc] init]; 
8

Заменить

[[self.myValidator alloc] init]; 

с

self.myValidator = [[TextValidator alloc] init]; 

Сигналы об ошибках, которые не реализованы метод alloc экземпляра для self.myValidator, что верно. Но это метод класса, который применяется для всех объектов NSObject.

+0

Правильный плюс один –

0

Для тех, кто получает ошибку "no visible @interface for declares the selector ..."

такой ошибки, как правило, происходит, когда вы ошиблись при вводе имени метода, или этот метод не относится к этому классу вовсе и не существует в вашем класс

0

У меня была эта проблема сегодня, и я решил ее самостоятельно. В принципе, вы также не можете удовлетворять всем требованиям функции/процедуры.

Пойдите в класс и убедитесь, что вы декларируете все требования.

Я взял класс из библиотеки заголовков и сравнил его слово в слово, чтобы убедиться, что он соответствует функции, использующей его.

0

Если вы испытываете это случайно (например, когда вы меняете ветви), не потому, что вы забыли объявить селектор.

Перейти к файл инспектор>Target Членский

  1. снимите отметку целей
  2. затем проверить его снова

File Inspector

Это освежит project.pbxproj

Тогда, если вы строите, вы увидите, ваша реальная проблема

0

для других: Проверьте varible имя не как имя класса. Ну, это случается со мной.

XXXViewController * XXXViewController = [[XXXViewController alloc] init]; 

Не говорите никому, как я, прямо сейчас.

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