预期';'在声明清单目标c的末尾

时间:2016-09-24 05:03:40

标签: objective-c

“错误:预期';'在声明清单末尾“目标c 当我试图声明全局变量

  @implementation CachingManager{
NSMutableArray*object = [[NSMutableArray alloc] init];
}

3 个答案:

答案 0 :(得分:2)

您可以在此处创建实例变量,但不能像您一样在此处初始化这些实例变量。 它们都被初始化为零或零。所以当你写一个等号时,编译器会期望一个分号。

您可以在init方法或其他进行类初始化的方法中初始化它们,以使它们成为全局变量。 e.g。

.m文件中的实例变量的接口块:

@interface CachingManager ()
{
    // instance variables initialized to nil or zeroes
    NSMutableArray *object;   // global ivar
}
@end

实施部分.m文件:

@implementation CachingManager

- (void)viewDidLoad {
    [super viewDidLoad];
    object = [[NSMutableArray alloc] init];   // initialization takes place
}

答案 1 :(得分:1)

这不是一个全球变量。那将是一个实例变量,并且特定语法在2005年之后并不常用(实际上,它在90年代中期之后并不常见)。

如果你想要一个全局变量,请执行:

 NSMutableArray *myGlobal;

位于顶层的某个位置 - 与您的来源@implementation处于同一级别。

但是,你必须在其他地方初始化全局变量。通常,在类的+ initialize或+ load方法中。

答案 2 :(得分:1)

实现全局变量并管理它们的生命周期(即它们被初始化)甚至提供全局方法的一种方法是实现暴露这些变量/方法并使用单例模式的类:

<强> yourFile.h:

#import <Foundation/Foundation.h>

@interface GlobalVars : NSObject
{
    NSMutableArray *_truckBoxes;
    NSMutableArray *_farmerlist;
    NSString *_farmerCardNumber;
    NSString *_fName;
}

+ (GlobalVars *)sharedInstance;

@property(strong, nonatomic, readwrite) NSMutableArray *truckBoxes;
@property(strong, nonatomic, readwrite) NSMutableArray *farmerList;
@property(strong, nonatomic, readwrite) NSString *farmerCardNumber;
@property(strong, nonatomic, readwrite) NSString *fName;

@end

<强> yourFile.m:

#import "GlobalVars.h"

@implementation GlobalVars

@synthesize truckBoxes = _truckBoxes;
@synthesize farmerList = _farmerList;
@synthesize frameCardNumber = _frameCardNumber;
@synthesize fName = _fName;

+ (GlobalVars *)sharedInstance {
    static dispatch_once_t onceToken;
    static GlobalVars *instance = nil;
    dispatch_once(&onceToken, ^{
        instance = [[GlobalVars alloc] init];
    });
    return instance;
}

- (id)init {
    self = [super init];
    if (self) {
        _truckBoxes = [[NSMutableArray alloc] init];
        _farmerlist = [[NSMutableArray alloc] init];
        // Note these aren't allocated as [[NSString alloc] init] doesn't provide a useful object
        _farmerCardNumber = nil;
        _fName = nil;
    }
    return self;
}

然后您可以使用这样的全局变量,例如:

GlobalVars *globals = [GlobalVars sharedInstance];
globals.fName = @"HelloWorld.txt";
[globals.farmerList addObject:@"Old Macdonald"];
[self processList:[globals farmerList]];

但请考虑:

您不需要像这样使用全局变量;您应该能够创建一个模型对象,该对象根据需要创建,并引用它传递给视图。这是MVC。 您还发布了一个与Objective-C极为常见的无关问题的堆栈跟踪;一旦你意识到它是什么,只有你能解决这个错误。