由于循环引用

时间:2017-03-29 14:30:44

标签: ios objective-c circular-reference

我有两个类的头和它的扩展名(由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;。现在弹出两个错误,说它是一个未定义的类。已附上以下错误的屏幕截图。我不太明白为什么会发生这种情况以及我需要做些什么来解决它。任何帮助深表感谢。谢谢!

enter image description here

链接错误

  

重复符号_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查看调用)

3 个答案:

答案 0 :(得分:0)

  

所以我在Conversation + CoreDataProperties.h中注释掉了import语句并添加了@class Conversation;。

如果您未使用Convention类的任何界面(例如声明类型为Convention的属性),则只能执行此操作。您可以&如果您通过类别或类扩展程序扩展Convention,请执行此操作。

你必须在这里解决一个合法的循环引用。你可以:

  1. 将类和类别移动到同一个源文件中(如果没有特殊原因,这需要在一个类别中,您可以将fetchRequest的声明移到类本身中。)< / LI>
  2. 停止在类标题中导入+CoreDataProperties.h,然后在调用者需要调用fetchRequest的任何地方导入它。

答案 1 :(得分:0)

重复符号警告的结果是因为

  1. 您的项目中有多次该类,编译器不知道,选择哪个(然后它主要是重复的链接错误)
  2. 你的 ConversationDate + CoreDataClass
  3. 有问题

    只是从源代码中提出的一个问题:为什么要导入要扩展的类的扩展名?

    #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也可能自己创建它们。

    请查看您的xCode项目,如下所示: Use lookup functionality on the bottom left of xCode

答案 2 :(得分:0)

在此Error in installation log for Visual Studio 2013 Update 2 RC can be misleading中找到了我的问题的解决方案。我只需要从Compile Sources中删除.m文件。