Objective-C #import Confusion

I'm still a bit confused about the #import instruction in Objective-C. I have a header file (Common.h) where I keep some constant NSStrings that are used throughout the application. So far I have used #import "Common.h" in 2 classes, and I get a build error:

 duplicate symbol _EX_XML_URL in /Users/username/Library/Developer/Xcode/DerivedData/projectname-ffvcivanbwwtrudifbcjntmoopbo/Build/Intermediates/projectname.build/Debug-iphonesimulator/projectname.build/Objects-normal/i386/NewsView.o and /Users/username/Library/Developer/Xcode/DerivedData/projectname-ffvcivanbwwtrudifbcjntmoopbo/Build/Intermediates/projectname.build/Debug-iphonesimulator/projectname.build/Objects-normal/i386/ViewController.o for architecture i386 

EX_XML_URL is declared as:

  // // Common.h // Group of common constants used through out the application /* * Constant strings available to application */ #import <Foundation/NSString.h> NSString* EX_XML_URL = @"http://myurl.com/xmldata"; // URL for XML data NSString* EX_NO_CONNECTION = @"Network not availble"; NSString* EX_DEFAULT_IMAGE = @"logo.png"; 

I had the impression ( from this post ) that #import protects against header files that are included twice. What part am I missing here?

+4
source share
2 answers

In the header file (.h) you must declare a constant, and then you must define the constant and assign a value in your implementation file (.m).

in common.h

 extern NSString *const EX_XML_URL; 

in Common.m

 NSString *const EX_XML_URL = @"http://myurl.com/xmldata"; 


This is normal if the only thing you have in Common.m is constant definitions, if that’s how it works. Just make sure Common.m is included in the files that are compiled and linked to your target.

+6
source

You want to split the lines into 2 files, one of which will declare them extern in the header file, and another that actually contains literals:

.h

 extern NSString * const EX_XML_URL; 

.m

 NSString * const EX_XML_URL = @"http://myurl.com/xmldata"; 
+4
source

All Articles