2015-03-09 2 views
-2

Может ли кто-нибудь сказать мне, где я буду ошибаться здесь, пожалуйста. Я создал NSobject под названием BeaconData. Заголовочный файл:Objective C Глобальная переменная

#import <Foundation/Foundation.h> 
#import <CoreLocation/CoreLocation.h> 
#import <CoreBluetooth/CoreBluetooth.h> 

@interface BeaconData : NSObject 

@property (nonatomic, strong) NSMutableArray * jsonArray; 
@property (nonatomic, retain) NSString * bMajor; 
@property (nonatomic, retain) NSString * bMinor; 
@property (nonatomic, retain) NSString * bUUID; 

-(void) getData; 

@end 

Файл реализации затем:

#import "BeaconData.h" 
#define getDataURL @"http://www.eventav.biz/websitebeacons/library/json/files/beacons.txt" 

@implementation BeaconData 

@synthesize jsonArray, bUUID, bMajor, bMinor; 

//Retrieve data 
-(void) getData 
{ 
extern NSString * bUUID; 
extern NSString * bMajor; 
extern NSString * bMinor; 

NSURL * url = [NSURL URLWithString:getDataURL]; 
NSData * data = [NSData dataWithContentsOfURL:url]; 

jsonArray = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]; 

//Loop through Json Array 
for (int i = 0; i < jsonArray.count; i++) 
{ 
    bUUID = [[jsonArray objectAtIndex:i] objectForKey:@"i_uuid"]; 
    bMajor = [[jsonArray objectAtIndex:i] objectForKey:@"i_major"]; 
    bMinor = [[jsonArray objectAtIndex:i] objectForKey:@"i_minor"]; 
}  
} 
@end 

Далее я пытаюсь вызвать глобальную переменную bMajor в главном файле viewController.m и распечатать его - просто чтобы посмотреть, он работает, как это:

- (void)viewDidLoad { 
[super viewDidLoad]; 

extern NSString * bMajor; 

NSInteger beaconMajorInt = [bMajor integerValue]; 

NSLog (@"Beacon bMajor is %li", (long)beaconMajorInt); 

Но все это я получаю следующее сообщение об ошибке:

UNDEF ined символы для архитектуры x86_64: «_bMajor», ссылка от: - [ViewController viewDidLoad] в ViewController.o ld: символы (символы) не найдены для архитектуры x86_64 clang: ошибка: команда компоновщика завершилась с кодом выхода 1 (используйте -v, чтобы увидеть вызов)

+0

Это не глобальный вопрос, почему вы думаете, что это/хотите? – Wain

+0

Почему это не глобально? Вот в чем вопрос. Если я просто инициализирую переменную напрямую без массива - NSString * bMajor = @ "47008"; вот так - тогда это работает. – Mike

+0

Это не глобальная переменная. Это свойство, значение которого специфично для данного экземпляра объекта BeaconData. – rmaddy

ответ

0

Вы указали свою переменную bMajor как свойство класса. Это означает, что вы должны создать экземпляр вашего класса BeaconData для доступа к переменной, если вы не включите метод класса.

Однако в вашем коде я вижу, что вы также хотите сделать эти переменные глобальными. Недопустимо объявлять переменную как свойство класса, а затем пытаться сделать ее глобальной. В объекте-c просто объявление переменной вне раздела реализации сделает ее глобальной для всех модулей, которые импортируют файл с объявлением. Вы делаете это так:

NSString *bMajor = @"Your String"; 

@implementation BeaconData 
// YOUR CLASS CODE 
@end 

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

.h выглядит следующим образом:

extern NSString *bMajor; 

@interface BeaconData : NSObject 
@end 

Просто потому, что вы можете сделать, это не значит, что вы должны. Основываясь на вашем коде, я бы заподозрил, что вы хотите сделать, это превратить ваш метод -getData в метод класса для singleton, который позволяет классу управлять этими «глобальными» переменными, сохраняя при этом хорошую практику кодирования.

This SO Q/A should provide you exactly what you need to create your singleton. Я рекомендую вам сделать это таким образом.

Затем в вашем диспетчере просмотра вы получите доступ к этим переменным, получив экземпляр своего класса с помощью метода класса.

+0

спасибо. Я на самом деле посмотрел на одноэлементный подход, но я подумал, что так будет проще. Я вернусь к методу singleton. Спасибо за помощь :) – Mike