Error "Duplicate interface definition for class 'ViewController'" - ios

I'm making an app and I get the error
Duplicate interface definition for class 'ViewController'
I get this error in ViewController.h.
Here is the code I'm using when I get the error:
#interface ViewController : UIViewController <MFMailComposeViewControllerDelegate>
- (IBAction)Contact:(id)sender;

Please paste more code. Sometimes the errors are somewhere else. Check that you have #interface and #end and do a clean before compiling.

Related

Linker "Duplicate Symbol" error due to circular reference

I have two header of a class and it's extension(generated by Xcode for NSManaged object). But I'm getting a linker error and I figured out it was due to a circular reference.
Conversation+CoreDataClass.h
NS_ASSUME_NONNULL_BEGIN
#interface Conversation : NSManagedObject
#end
NS_ASSUME_NONNULL_END
#import "Conversation+CoreDataProperties.h"
Conversation+CoreDataProperties.h
#import "Conversation+CoreDataClass.h"
NS_ASSUME_NONNULL_BEGIN
#interface Conversation (CoreDataProperties)
+ (NSFetchRequest<Conversation *> *)fetchRequest;
#end
NS_ASSUME_NONNULL_END
You can clearly see the circular reference here. I found this question where the problem was to add a #class declaration and remove the header. So I commented out the import statement in the Conversation+CoreDataProperties.h and added #class Conversation;. Now two errors pop up saying it's an undefined class. Have attached the screenshot of the error below. I don't quite understand why this is happening and what I need to do to fix it. Any help is much appreciated. Thanks!
Linker error
duplicate symbol _OBJC_CLASS_$_Conversation in:
/Users/xxx/Library/Developer/Xcode/DerivedData/xxx-gbhivuwptwzhkldfbmjghkokozgn/Build/Intermediates/xxx.build/Debug-iphoneos/xxx.build/Objects-normal/arm64/Conversation+CoreDataClass.o
duplicate symbol _OBJC_METACLASS_$_Conversation in:
/Users/xxx/Library/Developer/Xcode/DerivedData/xxx-gbhivuwptwzhkldfbmjghkokozgn/Build/Intermediates/xxx.build/Debug-iphoneos/xxx.build/Objects-normal/arm64/Conversation+CoreDataClass.o
duplicate symbol _OBJC_CLASS_$_ConversationDate in:
/Users/xxx/Library/Developer/Xcode/DerivedData/xxx-gbhivuwptwzhkldfbmjghkokozgn/Build/Intermediates/xxx.build/Debug-iphoneos/xxx.build/Objects-normal/arm64/ConversationDate+CoreDataClass.o
duplicate symbol _OBJC_METACLASS_$_ConversationDate in:
/Users/xxx/Library/Developer/Xcode/DerivedData/xxx-gbhivuwptwzhkldfbmjghkokozgn/Build/Intermediates/xxx.build/Debug-iphoneos/xxx.build/Objects-normal/arm64/ConversationDate+CoreDataClass.o
ld: 4 duplicate symbols for architecture arm64 clang: error: linker
command failed with exit code 1 (use -v to see invocation)
So I commented out the import statement in the Conversation+CoreDataProperties.h and added #class Conversation;.
You may only do this if you're aren't using any of the Convention class's interface (for instance declaring a property of type Convention. You can't do this if you're extending Convention via a category or class extension.
You have a legit circular reference here you must resolve. You can either:
Move the class and the category into the same source file (if there's no special reason this needs to be in a category you could just move the declaration of fetchRequest into the class itself).
Stop importing +CoreDataProperties.h in the class header, and import it instead wherever callers need to be calling fetchRequest.
the duplicate symbols warning do result because
You have the class multiple times in your project and the compiler does not know, which to choose (then it is mostly a duplicate linking error)
There is something wrong with your ConversationDate+CoreDataClass
Just a question that raised from your source code: why do you import an extension of the class you want to extend?
#import "Conversation+CoreDataClass.h"
#interface Conversation (CoreDataProperties)
+ (NSFetchRequest<Conversation *> *)fetchRequest;
#end
All the extension class usually needs to know are basically the classes they extend:
#import "Conversation.h"
#interface Conversation (CoreDataProperties)
+ (NSFetchRequest<Conversation *> *)fetchRequest;
#end
Only the implementation file (.m) would have to import the header file. E.g:
#import "Conversation+CoreDataClass.h"
#implementation Conversation (CoreDataProperties)
+ (NSFetchRequest<Conversation *> *)fetchRequest {
// body
return nil;
}
#end
And last question: Are you sure there exists no other class extension with the same name in your project? CoreData might also have created them itself.
Please have a look in your xCode Project like this:
Found the solution to my problem in this answer. I just had to remove the .m files from the Compile Sources.

Objective-C: Expected a type error

I am trying to follow a tutorial for using a stylesheet from Nick Kuh's book "iPhone App Development". The stylesheet header file is throwing:
"Expected a type"
errors which I think normally reflects a circular problem. However, in this case the only import is to Foundation.h. (The implementation file, btw, does not throw any errors and seems to be fine.) Here is the header file in its entirety.
#import <Foundation/Foundation.h>
typedef enum : int {
IDLabelTypeName = 0,
IDLabelTypeBirthdayDate,
IDLabelTypeDaysUntilBirthday,
IDLabelTypeDaysUntilBirthdaySubText,
IDLabelTypeLarge
}
IDLabelType;
#interface IDStyleSheet : NSObject
+(void)initStyles;
+(void)styleLabel:(UILabel *)label withType:(IDLabelType)labelType;//throws red error
+(void)styleTextView:(UITextView *)textView;//throws red error
+(void)styleRoundCorneredView:(UIView *)view;//throws red error
#end
Can anyone see why these errors are occurring?
UILabel, UITextView ... are defined in the UIKit framework, therefore you have to
#import <UIKit/UIKit.h>
(which then implicitly imports Foundation). You can also use the
more modern "module" syntax:
#import UIKit;

Objective- C - duplicate interface definition for class

When I build my app in Xcode, I have this error:
Duplicate interface definition for class BFTask
I followed some tutorials and answers, on this site, about headers and I modified it, but nothing has changed. The same error persist during build.
in BFtask.h file:
#import<foundation/Foundation.h>
#class BFTask;
.
.
.
#interface BFTask:NSObject
...
in BFTaskCompletionSource.h file:
#class BFTask;
#interface BFTaskCompletionSource;
in BFTaskCompletionSource.m file:
#import<foundation/Foundation.h>
#import "BFTask.h"
#interface BFTaskCompletionSource()
...
#interface BFTask(BFTaskCompletionSource)
You haven't shown us the BFTask.m file. I suspect you will find you have an #interface BFTask at the top of that file. If you want to declare any additions to a class in the .m file, you have to have an #interface BFTask () with the parentheses...
I have tested this and if you leave out the parentheses, the specific wording you will get for the error is, "Duplicate interface definition for class 'BFTask'"... exactly as you have reported.
If this is correct, you have two possible ways to fix this in the BFTask.m file:
If there is nothing between the #interface BFTask and the following #end, just delete them both.
If there are additional methods or properties declared there, just add a pair of parentheses after the BFTask to have #interface BFTask ().

Multiple ViewController inheritance causes Apple Mach-O Linker Error

I'm setting up a base view controller called "BHAccountBaseViewController" and two other views that inherit from some basic functionality from the base controller.
"BHAccountBaseViewController" Inherits from "UIViewController"
"BHAccountViewController" (implements UITextFieldDelegate) and Inherits from "BHAccountBaseViewController"
Lastly I have one recently created class that I called "BHCreateProfileViewController" every time that I just simply include #import directive to "BHAccountBaseViewController" to inherit from this class Xcode fails to compile due to APPLE MACH-O LINKER ERROR!
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Thoughts? these are my three header files
BHAccountBaseViewController
#import <UIKit/UIKit.h>
#import "BHFileManager.h"
#interface BHAccountBaseViewController : UIViewController
#end
BHAccountViewController
#import "BHAccountBaseViewController.h"
#interface BHAccountViewController : BHAccountBaseViewController<UITextFieldDelegate>
#end
BHCreateProfileViewController
#import "BHAccountBaseViewController.m"
#interface BHCreateProfileViewController : UIViewController <UITextFieldDelegate>
#property (strong, nonatomic) id user;
#end
if I comment out the import on the last file the linker error goes a way! but I want to be able to inherit from my base clase ... thoughts?
Help would be much appreciated!
In implementation of BHCreateProfileViewController given above, I found the code looks like getting wrong at first line. What about fixing it as following:
#import "BHAccountBaseViewController.m"
to
#import "BHAccountBaseViewController.h"
and I wonder why BHCreateProfileViewController comes to inherit from UIViewController not BHAccountBaseViewController. Could you explain that?
This might be due to the retain cycle deadlock problem. You have to use forward class declaration for this i.e you can try #Class instead of #import. Please refer to these limks :
Objective-C: Forward Class Declaration
#class vs. #import
These might help.
In the compilation time your compiler would actually look for your interface files instead of implementation file.Compiler does not bother even if .m file is not available. So while importing you are supposed to import .h instead .m.

How to resolve the "Expected a type" error in ios

Am new to development.I got an error regarding the "Expected a Type" error.In two classes of my application,i declared the method in one class and in another class i used that method with the help of #protocol method.How to resolve it.Two classes DayButton.h and DDCalenderView.h
In DayButton.h, i declared as
#protocol DayButtonDelegate <NSObject>
-(void)dayButtonPressed:(id)sender;
#end
And in DDCalenderView.h,i wrote as
#protocol DDCalenderViewDelegate<NSObject>
-(void)dayButtonPressed:(DayButton *)button;
Getting an exception near void method in DDCalenderView.h
SOLUTION: Move the import from the implementation to the header file.
I think that there were some imports in the implementation file that were not in the header file.Make sure that you have the correct import. It’s one of those little bugs/mistakes that make you shake your head… at yourself.
In DDCalenderView.h you should type #class DayButton; above #protocol DDCalenderViewDelegate<NSObject>. This will tell the compiler that DayButton is a class (that is declared somewhere else).
You can also add #import "DayButton.h" to the top of DDCalenderView.h.

Resources