Как получить доступ к массиву из одного файла в другом файле?

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

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

NSInteger charactersLocked[3] = {0,0,1};
int charSel = 0;

@interface Tutorial : UIViewController 
{
    -------
}
------
@end

Поэтому мне нужно получить доступ к массиву charactersLocked в другом файле.m, назовем его File2, а этот File1. Когда я пытаюсь #import "File1.h" в File2.m, программа аварийно завершает работу и выдает мне эту ошибку для обоих символов Locked и charSel:

 duplicate symbol _charactersLocked in:
    /Users/me/Library/Developer/Xcode/DerivedData/SpaceRace-
    apawbkpiogvbvddranqfltyybuqr/Build/Intermediates/SpaceRace.build/Debug- 
    iphoneos/SpaceRace.build/Objects-normal/arm64/Tutorial.o
    /Users/me/Library/Developer/Xcode/DerivedData/SpaceRace
    apawbkpiogvbvddranqfltyybuqr/Build/Intermediates/SpaceRace.build/Debug-
    iphoneos/SpaceRace.build/Objects-normal/arm64/Space.o

Я понятия не имею, что это такое. Я пытался найти решения в Интернете, но ни одно из них, похоже, не работает. Я не импортирую файл.m случайно. Если есть более простой способ получить доступ к этому конкретному массиву, пожалуйста, дайте мне знать. Извините, если этот пост был ужасно отформатирован, это мой первый раз, так что терпите меня. Спасибо.

1 ответ

Краткий ответ на ваш вопрос находится в этом ответе; вам нужно объявить ваши переменные как extern чтобы компилятор знал, что вы хотите использовать его в нескольких файлах.


Это очень редко делается в Objective-C, поскольку его наследие как объектно-ориентированного языка программирования означает, что глобальное состояние в программах чаще всего обрабатывается в методах классов или одноэлементных классах. Не зная слишком много о вашей программе, я собираюсь догадаться, что вы хотите одноэлементный класс, что-то вроде CharacterLocker, который будет выглядеть так:

CharacterLocker.h

@interface CharacterLocker : NSObject
{
    NSInteger charactersLocked[3];
}

+ (id) sharedObject;

@property NSInteger* charactersLocked;

@end

CharacterLocker.m

@implementation CharacterLocker

@synthesize charactersLocked;

+ (void) sharedObject
{
    static CharacterLocker *singleton = nil;

    // Required so that multiple calls to sharedObject don't create two
    static dispatch_once_t pred;
    dispatch_once(&pred, ^{ singleton = [[CharacterLocker alloc] init]; });
    return singleton;
}

- (id) init
{
    if ( self = [super init] )
    {
        charactersLocked[0] = 0;
        charactersLocked[1] = 0;
        charactersLocked[2] = 1;
    }
    return self;
}

@end

Затем в своем коде вы звоните [CharacterLocker sharedObject].charactersLocked для доступа к массиву.

Другие вопросы по тегам