我有两个类的头和它的扩展名(由Xcode为NSManaged对象生成)。但我得到一个链接器错误,我发现这是由于循环引用。
对话+ CoreDataClass.h
NS_ASSUME_NONNULL_BEGIN
@interface Conversation : NSManagedObject
@end
NS_ASSUME_NONNULL_END
#import "Conversation+CoreDataProperties.h"
对话+ CoreDataProperties.h
#import "Conversation+CoreDataClass.h"
NS_ASSUME_NONNULL_BEGIN
@interface Conversation (CoreDataProperties)
+ (NSFetchRequest<Conversation *> *)fetchRequest;
@end
NS_ASSUME_NONNULL_END
您可以在此处清楚地看到循环引用。我发现这个question的问题是添加@class
声明并删除标题。因此,我在import
中注释了Conversation+CoreDataProperties.h
语句并添加了@class Conversation;
。现在弹出两个错误,说它是一个未定义的类。已附上以下错误的屏幕截图。我不太明白为什么会发生这种情况以及我需要做些什么来解决它。任何帮助深表感谢。谢谢!
链接错误
重复符号_OBJC_CLASS _ $ _对话: /Users/xxx/Library/Developer/Xcode/DerivedData/xxx-gbhivuwptwzhkldfbmjghkokozgn/Build/Intermediates/xxx.build/Debug-iphoneos/xxx.build/Objects-normal/arm64/Conversation+CoreDataClass.o 重复符号_OBJC_METACLASS _ $ _对话: /Users/xxx/Library/Developer/Xcode/DerivedData/xxx-gbhivuwptwzhkldfbmjghkokozgn/Build/Intermediates/xxx.build/Debug-iphoneos/xxx.build/Objects-normal/arm64/Conversation+CoreDataClass.o 重复符号_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 重复符号_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:架构arm64 clang的4个重复符号:错误:链接器 命令失败,退出代码为1(使用-v查看调用)
答案 0 :(得分:0)
所以我在Conversation + CoreDataProperties.h中注释掉了import语句并添加了@class Conversation;。
如果您未使用Convention
类的任何界面(例如声明类型为Convention
的属性),则只能执行此操作。您可以&如果您通过类别或类扩展程序扩展Convention
,请执行此操作。
你必须在这里解决一个合法的循环引用。你可以:
fetchRequest
的声明移到类本身中。)< / LI>
+CoreDataProperties.h
,然后在调用者需要调用fetchRequest
的任何地方导入它。答案 1 :(得分:0)
重复符号警告的结果是因为
只是从源代码中提出的一个问题:为什么要导入要扩展的类的扩展名?
#import "Conversation+CoreDataClass.h"
@interface Conversation (CoreDataProperties)
+ (NSFetchRequest<Conversation *> *)fetchRequest;
@end
所有扩展类通常需要知道的基本上是它们扩展的类:
#import "Conversation.h"
@interface Conversation (CoreDataProperties)
+ (NSFetchRequest<Conversation *> *)fetchRequest;
@end
只有实现文件(.m)才能导入头文件。 E.g:
#import "Conversation+CoreDataClass.h"
@implementation Conversation (CoreDataProperties)
+ (NSFetchRequest<Conversation *> *)fetchRequest {
// body
return nil;
}
@end
最后一个问题:您确定项目中没有其他具有相同名称的类扩展吗? CoreData也可能自己创建它们。
答案 2 :(得分:0)
在此Error in installation log for Visual Studio 2013 Update 2 RC can be misleading中找到了我的问题的解决方案。我只需要从Compile Sources中删除.m文件。