我在视图控制器实现文件中声明了这个数组:
NSMutableArray *images = [NSMutableArray array];
我想要一个空的,可变的数组,我稍后会添加UIImageViews。它总是返回错误:
initializer element is not constant
答案 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";
将编译得很好。