iOS error: No visible @interface for 'xxxx' declares the selector 'alloc'

佐手、 提交于 2019-12-07 03:45:08

问题


Here is my TextValidator class:

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

This is the way I try to initialise the TextValidator class in 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

When I try to compile the code I get the following error:

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

TextValidator class inherits from NSObject and as far as I know init and alloc functions are already defined at the base class. So why does the program gives such an error?

Note that, I already checked this topic and it doesn't work for me.


回答1:


My psychic debugger, without reading your code, tells me you're calling alloc on an object instance, rather than a class. The alloc method is a static method defined by classes (typically inherited from NSObject) that returns a new instance of the underlying object. You can't ask an instance to allocate itself!

Now looking at the code, I see that you want:

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

to construct a new instance, and assign it to the myValidator property.




回答2:


Replace

[[self.myValidator alloc] init];

with

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

The error signals that you have not implemented the alloc instance method for self.myValidator, which is true. But that's a class method that applies for all NSObject objects.




回答3:


Your syntax of creating object is incorrect. Correct code:

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



回答4:


For Others : Check the varible name is not like the class name. Well it happend to me.

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

Don't tell anyone like I did right now.




回答5:


For those who get the error of "no visible @interface for declares the selector ..."

such an error usually happens when you have mistyped the name of the method, or that method doesn't belong to that class at all and doesn't exist in your class




回答6:


I had this problem today and solved it on my own. Basically you could also not be satisfying all the requirements of the function / procedure.

Go into the class itself and make sure your declaring all the requirements.

I took the class out of the header library and compared it word for word to verify it matches the function using it.




回答7:


If you experience this randomly (like when you are changing branches), not because you forgot to declare selector.

Go to file inspector > Target Membership

  1. uncheck the targets
  2. then check it again

This will refresh your project.pbxproj

Then if you build, you'll see your real problem



来源:https://stackoverflow.com/questions/19974682/ios-error-no-visible-interface-for-xxxx-declares-the-selector-alloc

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!