Objective-C #import 混淆

4
我还对Objective-C中的#import语句有点困惑。我有一个头文件(Common.h),其中保存了一些在整个应用程序中使用的常量NSStrings。到目前为止,我已经在两个类中使用了#import "Common.h",但我遇到了构建错误:
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的声明如下:

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

我以为(来自这篇文章),#import 可以防止头文件被重复包含。那么我漏掉了什么?

1
#import 防止头文件在 同一实现文件 中被包含两次。它消除了 C 头文件中熟悉的 #IFNDEF 逻辑的需要。 - Hot Licks
2个回答

6
在您的头文件(.h)中,您应该只声明常量,然后在您的实现(.m)文件中定义常量并赋值。
在Common.h中:
extern NSString *const EX_XML_URL;

in Common.m

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


如果Common.m文件只包含常量定义,那也可以,如果情况确实如此,请确保在编译和链接到目标文件中时包含Common.m文件。


NSGod 致敬并点赞,他在我还在编辑答案时就已经发布了这些代码。干得好,先生。 - Mike Hay

4

你需要将这些字符串拆分成两个文件:一个在头文件中声明它们为extern,另一个实际包含字面值的文件:

.h

extern NSString * const EX_XML_URL;

.m

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接