ios Объектив- c дубликаты символов для архитектуры arm64 - PullRequest
0 голосов
/ 18 апреля 2020

Поднимая мои руки в воздухе с этим. Я пробовал протоколы, пересылаю объявленные классы, пересылаю объявленные протоколы и не могу понять, какая конфигурация работает. Я собираюсь перечислить файлы заголовков, чтобы вы могли видеть, что импортируется, но я уверен, что проблема заключается в круговой загрузке импорта.

Ошибка:

Ld /Users/eamonwhite/Library/Developer/Xcode/DerivedData/maggie-govvbppylostlwaashtkbcuawqzc/Build/Products/Debug-iphoneos/maggie.app/maggie normal arm64 (в целевом 'magg ie) 'magg ie') cd / Users / eamonwhite / maggie / maggie /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -target arm64-apple-ios13.4 -isys root /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.4.sdk -L / Пользователи / eamonwhite / Библиотека / Разработчик / Xcode / DerivedData / magg ie -govvbppylostlawashqcbcu Build / Продукты / Debug-iphoneos -F / Пользователи / eamonwhite / Библиотека / Разработчик / Xcode / DerivedData / magg ie -govvbppylostlwaashtkbcuawqzc / Build / Продукты / Debug-iphoneos -filelist / Пользователи / eamonwhite / Библиотека / Разработчик / Xcode / Derivedata / Магг * 106 8 * -govvbppylostlwaashtkbcuawqzc / Build / Intermediates.noindex / magg ie .build / Debug-iphoneos / magg ie .build / Объекты-нормальные / arm64 / magg ie .LinkFileList -Xlinker -rpath -Xpath_table_exetable @ execute Рамки .build / Objects-normal / arm64 / maggie_lto.o -Xlinker -export_dynami c -Xlinker -no_deduplicate -fembed-bitcode-marker -fobj c -ar c -fobj c -link-runtime -Xlinker -dependency_info -Xlinker /Users/eamonwhite/Library/Developer/Xcode/DerivedData/maggie-govvbppylostlwaashtkbcuawqzc/Build/Intermediates.noindex/maggie.build/Debug-iphonebase/make normal / arm64 / maggie_dependency_info.dat -o /Users/eamonwhite/Library/Developer/Xcode/DerivedData/maggie-govvbppylostlwaashtkbcuawqzc/Build/Products/Debug-iphoneos/magg*ggmama8484/magg*100ma1084/app * * 100 7 * повторяющийся символ «_OBJC_CLASS _ $ _ PersistentContainer» в: /Users/eamonwhite/Library/Developer/Xcode/DerivedData/maggie-govvbppylostlwaashtkbcuawqzc/Build/Intermediates.noindex/ugild*D86 1087 * .build / Objects-normal / arm64 / AppDelegate.o /Users/eamonwhite/Library/Developer/Xcode/DerivedData/maggie-govvbppylostlwaashtkbcuawqzc/Build/Intermediates.noindex/magg*10eb.bu /maggie.build/Objects-normal/arm64/ViewController.o повторяющийся символ '_OBJC_METACLASS _ $ _ PersistentContainer' в: / Users / eamonwhite / Библиотека / Разработчик / Xcode / DerivedData / magg ie -govvbppylostlwaashtcates. noindex / magg ie .build / Debug-iphoneos / magg ie .build / Objects-normal / arm64 / AppDelegate.o / Пользователи / eamonwhite / Библиотека / Разработчик / Xcode / DerivedData / magg ie -govvbppylostlwaashtkbcuawqzc / Bug /Intermediates.noindex/maggie.build/Debug-iphoneos/maggie.build/Objects-normal/arm64/ViewController.o ld: 2 повторяющихся символа для архитектуры arm64 cla ng: error: команда компоновщика завершилась неудачно с кодом выхода 1 (используйте -v для просмотра вызова)

В нижней части ошибки указано, какие файлы дублируются:

_OBJC_CLASS_$_PersistentContainer (иначе PersistentContainer.h, или предварительное заявление об этом, я не уверен) _OBJC_METACLASS_$_PersistentContainer (опять же, я не знаю, в чем разница между METACLASS и CLASS, я предполагаю, что METACLASS является предварительным объявлением, как @class).

Из ошибки следует, что этот файл дублируется как в AppDelegate.o (он же AppDelegate.h), так и в ViewController.o (скомпилированная версия ViewController.h) - вот соответствующие части этих файлов:

AppDelegate.h:

#import <UIKit/UIKit.h>
#import <CoreData/CoreData.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@end

AppDelegate.m:

#import "AppDelegate.h"
#import "PersistentContainer.h"

@interface AppDelegate () 

@property (strong, nonatomic) NSManagedObjectContext* managedObjectContext;
@property (strong, nonatomic) NSPersistentStoreCoordinator* persistentStoreCoordinator;
@property (strong, nonatomic) NSPersistentStoreAsynchronousFetchResultCompletionBlock callback;
@property (nonatomic, strong) PersistentContainer *persistentContainer;

- (PersistentContainer*)persistentContainer;

@end

@implementation AppDelegate

...

ViewController.h:

#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>

@class PersistentContainer;

@protocol ViewControllerDelegate <NSObject>

- (PersistentContainer*)getPersistentContainer;

@end

@interface ViewController : UIViewController <CLLocationManagerDelegate, ViewControllerDelegate>

@property (weak, nonatomic) id<ViewControllerDelegate> delegate;

@end

ViewController.m:

#import "ViewController.h"
#import "HeaderCollection.h"
#import "PersistentContainer.h"

@interface ViewController ()

@property (nonatomic, strong) CLLocationManager* locationManager;
@property (nonatomic) UILabel* heading_label;
@property (nonatomic) UILabel* location_label;
@property (nonatomic) UILabel* loc_timestamp_label;
@property (nonatomic) UILabel* heading_accuracy_label;
@property (nonatomic) UILabel* mag_heading_label;
@property (nonatomic) UILabel* true_heading_label;
@property (nonatomic) UILabel* heading_timestamp_label;
@property (nonatomic) PersistentContainer* persistentContainer;

- (PersistentContainer*)getPersistentContainer;

@end

@implementation ViewController

...

HeaderCollection.h не имеет значения, это всего лишь заголовки для модели CoreData.

Вот PersistentContainer.h:

#import <CoreData/CoreData.h>

@interface PersistentContainerProtocol : NSPersistentContainer

- (void)saveContext;

@end

@interface PersistentContainer : NSPersistentContainer

- (void)saveContext;

@end

@implementation PersistentContainer

- (void)saveContext {
    NSManagedObjectContext *context = [self viewContext];
    NSError *error = nil;
    if ([context hasChanges] && ![context save:&error]) {
        // Replace this implementation with code to handle the error appropriately.
        // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
        NSLog(@"Unresolved error %@, %@", error, error.userInfo);
        abort();
    }
}

@end

Нет файла .m для PersistentContainer - все есть в заголовочном файле.

Обычно я могу сам получить такую ​​вещь, но этот раздражал меня весь день, время, чтобы спросить о наборе глаз sh или о новой стратегии ... спасибо. Дайте мне знать, если вам нужно увидеть другие файлы, я понимаю, что это проблема циклического импорта, проблема может быть в другом файле. Спасибо.

1 Ответ

1 голос
/ 18 апреля 2020

Вы на самом деле обнаружили причину своей проблемы:

Для PersistentContainer нет файла .m - все находится в заголовочном файле.

Вам нужно поставить часть @implementation в файле .m, в противном случае все другие исходные файлы, импортирующие PersistentContainer.h, будут повторно реализовывать класс, что приведет к дублированию определения символа. Это потому, что каждый импорт эквивалентен записи одного и того же содержимого в файлы, которые выполняют импорт.

В отличие от C ++, где вам разрешено определять части реализации класса в заголовочных файлах в Objective- C Вы должны написать всю реализацию в файлах реализации.

...