我在视图控制器实现文件中声明了这个数组:
NSMutableArray *images = [NSMutableArray array];
我想要一个空的、可变的数组,稍后我会将 UIImageViews 添加到其中。它总是返回错误:
initializer element is not constant
我在视图控制器实现文件中声明了这个数组:
NSMutableArray *images = [NSMutableArray array];
我想要一个空的、可变的数组,稍后我会将 UIImageViews 添加到其中。它总是返回错误:
initializer element is not constant
正确的解决方案是创建images
一个实例变量,然后在您的init
方法中对其进行初始化。
@implementation SomeClass {
NSMutableArray *images; // instance variable
}
- (id)init {
self = [super init];
if (self) {
images = [[NSMutableArray alloc] init];
}
return self;
}
这是一个例子。如果您有特定的init...
方法,请改用它。
作为实例变量,类中的其他方法现在可以访问,images
并且类的每个实例都有自己的images
.
您需要显示更多代码,但如果这确实是出错的行,问题就很明显了。
您只能在非常特定的位置声明时动态初始化变量。 动态包括调用方法。
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];
}
您的构造的返回NSMutableArray
在编译时没有已知的地址。您只能在方法范围内动态初始化。
静态初始化会很好:例如,NSString *myString = @"Hello String";
在全局范围内编译就好了。