6

这是我的 TextValidator 类:

//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

这是我尝试在 ViewController.m 中初始化 TextValidator 类的方式:

//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 类继承自 NSObject ,据我所知 init 和 alloc 函数已经在基类中定义。那么为什么程序会出现这样的错误呢?

请注意,我已经检查了这个主题,它对我不起作用。

4

7 回答 7

16

我的心理调试器,没有阅读你的代码,告诉我你正在调用alloc一个对象实例,而不是一个类。该alloc方法是由类定义的静态方法(通常继承自NSObject),它返回底层对象的新实例。您不能要求实例自行分配!

现在查看代码,我看到您想要:

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

构造一个新实例,并将其分配给myValidator属性。

于 2013-11-14T10:04:55.633 回答
9

代替

[[self.myValidator alloc] init];

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

错误信号表明您尚未实现 的alloc实例方法self.myValidator,这是真的。但这是适用于所有NSObject对象的类方法。

于 2013-11-14T10:04:46.637 回答
1

您创建对象的语法不正确。正确代码:

self.myValidator = [[TextValidator alloc] init]; 
于 2013-11-14T10:04:28.183 回答
1

对于其他人:检查变量名类名不同。好吧,它发生在我身上。

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

不要像我现在那样告诉任何人。

于 2018-01-25T18:40:04.273 回答
0

对于那些得到错误的人"no visible @interface for declares the selector ..."

当您输入错误的方法名称,或者该方法根本不属于该类并且在您的类中不存在时,通常会发生此类错误

于 2016-01-26T17:25:46.910 回答
0

我今天遇到了这个问题,我自己解决了。基本上你也不能满足功能/过程的所有要求。

进入课程本身并确保您声明了所有要求。

我把这个类从头库中拿出来,逐字比较,以验证它是否与使用它的函数匹配。

于 2016-08-31T16:38:00.327 回答
0

如果您随机遇到这种情况(例如在更改分支时),不是因为您忘记声明选择器。

转到文件检查器>目标成员

  1. 取消选中目标
  2. 然后再次检查

文件检查器

这将刷新您的 project.pbxproj

然后,如果您构建,您将看到真正的问题

于 2016-09-09T05:50:16.000 回答