Getting Strange Error Running Objective C Code - objective-c

My project have no visible error but when i try to run it gives following error
Undefined symbols for architecture i386:
"_OBJC_CLASS_$_ConcreteScreen", referenced from:
objc-class-ref in ViewController.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
I am using my ContactScreen class in ViewController.m
i tried by #class ContactScree and #import "ContactScreen.h"
and in my ViewController i am using it as [ContactScreen myMethod];
when i comment out this line it work fine but now it is giving compile time error :(
yesterday it was wroking fine
here is my code
#import "ViewController.h"
#import "ConcreteScreen.h"
#interface ViewController ()
#end
#implementation ViewController
-(IBAction)btnContactPress:(id)sender{
NSLog(#"Contact Screen");
ConcreteScreen *coontact = [[ConcreteScreen alloc]init];
}

You confused ConcreteScreen and ContactScreen and compiler told you that it isn't aware about ConcreteScreen

Be sure your .m file is included in the project. It's possible to create it, use the header and all but it doesn't go into the build. Also it needs to be in the target.

Related

Undefined symbols "_OBJC_CLASS_$_" error

My project is written in ApplescriptObjC and Objective-C.
I have an NSTabViewDelegate, which must be written in ObjC:
#import <Cocoa/Cocoa.h>
#import "MSItems.h"
#interface MSTabView : NSTabView<NSTabViewDelegate>
- (void)tabView:(NSTabView *)tabView willSelectTabViewItem:(NSTabViewItem *)tabViewItem;
#end
#implementation MSTabView
- (void)tabView:(NSTabView *)tabView willSelectTabViewItem:(NSTabViewItem *)tabViewItem {
if ([[tabViewItem identifier] intValue] == 1) {
[MSItems myMethod];
}
}
#end
MSItems class is written in ApplescriptObjC, but I created a header file, which contains only the method I need to be called by other classes.
#import <Cocoa/Cocoa.h>
#class MSItems;
#interface MSItems : NSObject
+ (void) myMethod;
#end
In the ASObjC class i have:
script MSItems
property parent : class "NSObject"
on myMethod()
--stuff
end myMethod
end script
But the app doesn't compile and I get the error:
Undefined symbols for architecture x86_64:
"_OBJC_CLASS_$_MSItems", referenced from:
objc-class-ref in MSTabView.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Cocoa touch Framework with Unit tests

In Xcode 6 with Objective-C:
When I create a Cocoa Touch Framework the project has already a unit test target.
Assuming I have the following class and unit test case in my framework:
//Framework
#interface MyClass : NSObject
- (NSString*)greetings;
#end
#implementation MyClass
- (NSString*)greetings {
return #"Hello";
}
#end
// Test class
#import <UIKit/UIKit.h>
#import <XCTest/XCTest.h>
#import "MyClass.h"
#interface MyClassTests : XCTestCase
#end
#implementation MyClassTests
- (void)testGreetings {
MyClass *myClass = [[MyClass alloc] init];
XCTAssertTrue([[myClass greetings] isEqualToString:#"Hello"]);
}
#end
When I try to run the test I get:
Undefined symbols for architecture x86_64:
"_OBJC_CLASS_$_MyClass", referenced from:
objc-class-ref in MyClassTests.o
Why is the test target not finding my classes? I can't figure out what is wrong. I assume that the Xcode template would set up everything correctly.
you add this x86_64 architecture in Build setting -> Valid Architecture x86_64 and try it. It can be work.
Refer the architecture:
armv7: Used in the oldest iOS 7-supporting devices
armv7s: As used in iPhone 5 and 5C
arm64: For the 64-bit ARM processor in iPhone 5S
i386: For the 32-bit simulator
x86_64: Used in 64-bit simulator

clang: error: linker command failed with exit code 1 (use -v to see invocation) duplicate symbol _sprites for _game

I have a problem with my project. when i build my project, i have an error.
It shows duplicate symbol _sprites for _game
ld: 2 duplicate symbols for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
I had this same error, it was because I defined a constant with the same name in two separate .m files. Once I changed the name in one of them, it compiled.
For example in my ViewController.m I had:
#import "ViewController.h"
const int IPHONE4 = 480;
and in my Menu.m:
#import "Menu.h"
const int IPHONE4 = 480;
I changed my Menu.m to:
#import "Menu.h"
const int IPHONE4H = 480;

Objective-c subclassing gives linking error

I'm trying to port a game to iOS but I'm having a problem. I have a class called CKSprite with the following method:
- (id)initWithFile:(NSString *)fileName effect:(GLKBaseEffect *)effect
{
if ((self = [super init]))
{
//some stuff
}
return self;
}
I then have a subclass called CKPLayer (it has no other methods or properties at the moment other than what it inherits:
#property (strong) CKPlayer *player1;
But when I try to initialise it using the parent method:
self.player1 = [[CKPlayer alloc] initWithFile:#"Images/parrot.png" effect:self.effect];
I get this error:
Undefined symbols for architecture i386:
"_OBJC_CLASS_$_CKPlayer", referenced from:
objc-class-ref in CKViewController.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
This is my first time trying to do anything like this so I've probably done something stupid.
Any help will be greatly appreciated.
#import "CKSprite.h"
#interface CKPlayer : CKSprite
#end
The linker is missing the implementation for the class CKPlayer. Maybe you just forgot to implement it since it has "no other methods or properties at the moment", in that case just add a file which should look like:
#import "CKPlayer.h"
#implementation CKPlayer
#end
and ld should be happy

GCDAsyncUdpSocket does not compile for iOS

I use this library: https://github.com/robbiehanson/CocoaAsyncSocket
There are examples for TCP on the iphone but not UDP. I think that everything should be just the same. Here is my code:
#import <UIKit/UIKit.h>
#class GCDAsyncUdpSocket;
#interface ThirdViewController : UIViewController
{
GCDAsyncUdpSocket *udpSocket;
}
.m:
#import "ThirdViewController.h"
#import "DDLog.h"
#import "DDTTYLogger.h"
#import "GCDAsyncUdpSocket.h"
static const int ddLogLevel = LOG_LEVEL_VERBOSE;
#implementation ThirdViewController
- (void)viewDidLoad
{
[DDLog addLogger:[DDTTYLogger sharedInstance]];
udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
}
But when compiling I get the errors:
Undefined symbols for architecture i386: "_OBJC_CLASS_$_DDLog",
referenced from:
objc-class-ref in ThirdViewController.o "_OBJC_CLASS_$_DDTTYLogger",
referenced from:
objc-class-ref in ThirdViewController.o "_OBJC_CLASS_$_GCDAsyncUdpSocket",
referenced from:
objc-class-ref in ThirdViewController.o ld: symbol(s) not found for architecture i386
What is wrong? Examples from the library compiled without errors.
You have to link CFNetwork.framework or if have it you're propably working on Automatic Reference Counter, turon off ARC for GCDAsyncUdpSocket using -fno-objc-arc
(Build Phases >> Link Binary With Libraries) Add CocoaLumberjack as optional dependency.