Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

"No visible @interface for 'BlahDataController' declares the selector 'aMethod:'"

A simple example of my problem:

"Within the BlahDataController.h"

@interface BlahDataController : NSObject -(NSString *)aMethod:(NSString *)theString; @end 

"Within the BlahDataController.m"

#import "BlahDataController.h" @implementation BlahDataController  -(NSString *)aMethod:(NSString *)theString {     return @"Something"; }  @end 

"Within BobViewController.h"

@interface BobViewController : NSObject -(void)aMethodOfSomeSort; @end 

"Within BobViewController.m"

#import "BobViewController.h" #import "BlahDataController.h"  @implementation BobViewController  -(void)aMethodOfSomeSort {     BlahDataController *blahDataController = [[BlahDataController alloc] init];     NSLog(@"%@",[blahDataController aMethod:@"Variable"]); }  @end 

On the line "NSLog(@"%@",[blahDataController aMethod:@"Variable"]);" I'm receiving the error: "No visible @interface for 'BlahDataController' declares the selector 'aMethod:'"

Anyone know why this error is occurring?

-=-=-=-=-=-=-=-=-=-=-

The thing is, in my actual program, I have this same implementation and it works fine for hundreds of methods created this way. However, every so often, I'll receive this error on a newly created method. I didn't make it any differently. It just won't recognize it's newly created existence.

-=-=-=-=-=-=-=-=-=-=-

This is how I'm currently going around it, although I have no idea why the compiler accepts this way, but not the other:

Modify BobViewController.m:

#import "BobViewController.h" #import "BlahDataController.h" #import "AnotherDataController.h"  @implementation BobViewController  -(void)aMethodOfSomeSort {     BlahDataController *blahDataController = [[BlahDataController alloc] init];     AnotherDataController *anotherDataController = [[AnotherDataController alloc] init];     [anotherDataController fixedMethod:blahDataController theString:@"Variable"]; }  @end 

"Within the AnotherDataController.h"

@interface AnotherDataController : NSObject -(void)fixedMethod:(BlahDataController *)blahDataController theString:(NSString *)theString; @end 

"Within the AnotherDataController.m"

#import "AnotherDataController.h" #import "BlahDataController.h" @implementation AnotherDataController  -(void)fixedMethod:(BlahDataController *)blahDataController theString:(NSString *)theString {     NSLog(@"%@",[blahDataController aMethod:theString]); } @end 

And....it works just fine...So I imagine xcode is just failing to recognize the method in one class, and working as it should in another...Man, I have no idea why this error is occurring...

-=-=-

Minor Update:
Doing the entire "xcode dance" didn't solve the issue
1) Clean Build
2) Delete Derived Data
3) Completely Close XCode and reopen

like image 529
Highrule Avatar asked May 23 '12 20:05

Highrule


2 Answers

tl;dr - There's a duplicate file somewhere in the project! Go hunt it down and destroy it mercilessly!

Ok, for all those in the future with this issue; this is what the problem was.

I had made BlahDataController months ago. About a week ago, I restructured the folders of the project and moved BlahDataController from a folder called "Blah" to another folder called "Data".

When I changed the code for BlahDataController within the "Data" folder, one of my classes could see the changed code, however, another class couldn't.

What ended up being the issue was that when I moved BlahDataController, it actually created a copy of it. So I had a BlahDataController in the "Data" folder, and an older BlahDataController in the "Blah" folder. Even though the older BlahDataController was no longer attached to the project in the project manager (left side of xcode), the fact that the physical file still existed in the folder caused this issue.

After deleting the duplicate older copy of BlahDataController, the issue was resolved.

like image 109
Highrule Avatar answered Sep 17 '22 10:09

Highrule


If someone stumbles upon a similar problem, in my case I did some refactoring using "Find & Replace" feature (ignoring case) and I obtained something like this:

SomeClass* SomeClass = [[SomeClass alloc] init]; [SomeClass instanceMethod]; 

and it was saying: "No visible @interface for 'SomeClass' declares the method 'alloc'. So in my case the problem was I renamed the instance variable to upper case. The solution was:

SomeClass* someClass = [[SomeClass alloc] init]; [someClass instanceMethod]; 

PS: I recommend using the "Refactor" feature in Xcode instead of "Find & Replace" if possible.

like image 34
Maxim Chetrusca Avatar answered Sep 17 '22 10:09

Maxim Chetrusca