Objective C 全局变量

Objective C Global Variable

谁能告诉我哪里出错了。 我创建了一个名为 BeaconData 的 NSobject。头文件是:

#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

接下来我尝试调用主 viewController.m 文件中的全局变量 bMajor 并将其打印出来 - 只是为了看看它是否有效,如下所示:

- (void)viewDidLoad {
[super viewDidLoad];

extern NSString * bMajor;

NSInteger beaconMajorInt = [bMajor integerValue];

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

但我得到的只是以下错误:

未定义的体系结构符号x86_64: “_bMajor”,引用自: -[ViewController viewDidLoad] 在 ViewController.o ld:未找到体系结构的符号 x86_64 clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)

您已将 bMajor 变量声明为 class 属性。这意味着您必须实例化 BeaconData class 的实例才能访问该变量,除非您包含 class 方法。

但是,在您的代码中,我看到您还希望将这些变量设为全局变量。将变量声明为 class 属性 然后尝试使其成为全局变量是多余的。在 objective-c 中,简单地在实现部分之外声明一个变量将使它成为所有使用声明导入文件的模块的全局变量。你这样做:

NSString *bMajor = @"Your String";

@implementation BeaconData
// YOUR CLASS CODE
@end

您使用的 extern 关键字不正确。它应该在 .h class 文件中使用,让任何导入它的东西知道它们可以访问这个变量。 您还必须像我在 .m class 文件中显示的那样声明它

.h 看起来像这样:

extern NSString *bMajor;

@interface BeaconData : NSObject
@end

仅仅因为您可以做到这一点并不意味着您应该这样做。根据您的代码,我怀疑您想要做的是将您的 -getData 实例方法转换为允许 class 管理这些 "global" 变量的单例的 class 方法同时保持良好的编码习惯。

This SO Q/A should provide you exactly what you need to create your singleton.我建议你这样做。

然后在您的 viewController 中,您将通过使用 class 方法获取 class 的实例来访问这些变量。