Как получить доступ к массиву из одного файла в другом файле?
Я действительно новичок в 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
для доступа к массиву.