-1

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

NSMutableArray *images = [NSMutableArray array];

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

initializer element is not constant
4

3 回答 3

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.

于 2013-07-19T01:39:42.787 回答
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 中,这种状态存储在实例变量中。通常,您将定义一对实例方法来设置和获取该实例变量的值。这些称为访问器或设置器/获取器。在现代 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];
}
于 2013-07-19T01:26:53.283 回答
0

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

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

于 2013-07-19T01:32:21.603 回答