NSArray错误:初始化元素不是常量

时间:2013-07-19 00:41:35

标签: objective-c nsmutablearray

我在视图控制器实现文件中声明了这个数组:

NSMutableArray *images = [NSMutableArray array];

我想要一个空的,可变的数组,我稍后会添加UIImageViews。它总是返回错误:

initializer element is not constant

3 个答案:

答案 0 :(得分:2)

正确的解决方案是将images设为实例变量,然后在init方法中对其进行初始化。

@implementation SomeClass {
    NSMutableArray *images; // instance variable
}

- (id)init {
    self = [super init];
    if (self) {
        images = [[NSMutableArray alloc] init];
    }

    return self;
}

这是一个例子。如果您使用特定的init...方法,请改用它。

作为一个实例变量,该类中的其他方法现在可以访问images,并且该类的每个实例都有自己的images副本。

答案 1 :(得分:1)

你需要显示更多的代码,但问题是非常明显的,如果这真的是错误的那一行。

在非常具体的位置声明时,您只能动态初始化变量。 动态包括调用方法。

NSMutableArray *a = [NSMutableArray array]; // this will error.
static NSMutableArray *a = [NSMutableArray array]; // this will error.
@implementation Booger
{
      NSMutableArray *a = [NSMutableArray array]; // this will error
}
NSMutableArray *a = [NSMutableArray array]; // this will error.
- (void)bar
{
   NSMutableArray *a = [NSMutableArray array]; // this is fine
}

听起来你需要更深入地研究整个面向对象的事情。类是一组函数,称为方法,它们对类(类方法)或类的单个实例(实例方法)进行操作。实例可以存储在该实例上调用任何方法时可由所有方法访问的状态。在传统的OO中,此类状态存储在实例变量中。通常,您将定义一对实例方法来设置和获取该实例变量的值。这些被称为访问器或setter / getter。在现代Objective-C中,我们使用属性来声明实例变量和访问实例变量的方法。

因此:

@interface MyClass:NSObject
@property(strong) NSMutableArray *myArray;
@end

@implementation MyClass
// the @property will automatically create an instance variable called _myArray,
// a getter method called -myArray and a setter called -setMyArray:

- init
{
    self = [super init];
    if (self) {
       _myArray = [NSMutableArray array]; // set the ivar directly in init
    }
    return self;
}

- (void)maybeAddThisThing:(Thing *)aThing
{
     if ([aThing isCool] && ![[self myArray] containsObject:aThing]) {
         [[self myArray] addObject:aThing];
     }
}

- (void)nukeFromOrbit
{
    [self setMyArray:[NSMutableArray array]];
    // or you could do [[self myArray] removeAllObjects];
}

答案 2 :(得分:0)

NSMutableArray构造的返回在编译时没有已知的地址。您只能在方法范围内动态初始化。

静态初始化会很好:例如,全局范围内的NSString *myString = @"Hello String";将编译得很好。