谁能告诉我我在这里出错的地方。我创建了一个名为 BeaconData 的 NS对象。头文件是:
#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] in ViewController.o LD:在建筑x86_64中找不到符号 clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
您已将bMajor
变量声明为类属性。这意味着您必须实例化 BeaconData
类的实例才能访问该变量,除非您包含类方法。
但是,在您的代码中,我看到您还希望将这些变量设置为全局变量。将变量声明为类属性,然后尝试使其全局化是多余的。在 objective-c 中,只需在实现部分之外声明一个变量,即可使其对于使用声明导入文件的所有模块进行全局处理。你这样做是这样的:
NSString *bMajor = @"Your String";
@implementation BeaconData
// YOUR CLASS CODE
@end
您错误地使用了extern
关键字。它应该在 .h 类文件中使用,让导入它的任何内容知道他们有权访问此变量。您还必须像我在 .m 类文件中显示的那样声明它
.h 看起来像这样:
extern NSString *bMajor;
@interface BeaconData : NSObject
@end
仅仅因为您可以这样做并不意味着您应该这样做。根据您的代码,我怀疑您要做的是将-getData
实例方法转换为单例的类方法,该方法允许类管理这些"全局"变量,同时保持良好的编码实践。
此 SO Q/A 应准确提供创建单例所需的内容。我建议你这样做。
然后在 viewController 中,您将通过使用 class 方法获取类的实例来访问这些变量。