我有UIViewController
的子类,NSMutableArray
作为属性,可用作UITableView
的数据源。我在故事板中创建了一个类的实例。
我想使用addObject:
方法填充数组,但如果我尝试,则数组始终返回(null)
。
我读到@synthesize
没有初始化数组,我可能需要覆盖-init
并在那里初始化NSMutableArray
但-init
永远不会被调用。
这应该如何运作?
答案 0 :(得分:5)
您需要创建NSMutableArray
的实例并将其分配给该属性。
由于具有属性的对象是在故事板中创建的UIViewController
,因此您可以在几个不同的位置执行此操作。您可以覆盖initWithCoder:
,awakeFromNib
或viewDidLoad
。
如果您覆盖initWithCoder:
,则必须调用super
方法。
如果在viewDidLoad
中执行此操作,则在加载视图之前不会创建数组,这不必立即发生。
我建议在awakeFromNib
中执行此操作:
@synthesize myArray = _myArray;
- (void)awakeFromNib {
_myArray = [[NSMutableArray alloc] init];
}
另一种选择是通过覆盖属性的getter方法来懒惰地创建数组:
@synthesize myArray = _myArray;
- (NSMutableArray *)myArray {
if (!_myArray)
_myArray = [[NSMutableArray alloc] init];
return _myArray;
}
如果这样做,那么始终使用getter方法(self.myArray
或[self myArray]
)访问数组非常重要,永远不要直接访问实例变量(_myArray
)
答案 1 :(得分:2)
以下是您的代码所需的内容:
@interface BlahBlah : UIViewController
@property (...) NSMutableArray *myArray;
@end
首先,*myArray
只是一个等于nil的指针。你不能将它用作数组。它需要设置为有效的NSMutableArray实例。您需要在指定的初始化程序中执行此操作:
@implementation BlahBlah
@synthesize myArray;
// -initWithNibName:bundle: is the designated initializer for UIViewController
- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle
{
self = [super initWithNibName:nibName bundle:nibBundle];
if (self) {
myArray = [[NSMutableArray alloc] init];
// now you can add objects to myArray
}
return self;
}
- (void)dealloc
{
[myArray release];
[super dealloc];
}
请注意,您不能只覆盖-init;您必须覆盖您班级的指定初始化程序。弄清楚你正在实现什么子类,找出它的指定初始化程序,覆盖它(但通常需要调用超类实现),然后初始化你的属性。
这是Apple documentation regarding multiple/designated initializers。
答案 2 :(得分:0)
@synthesis既没有分配。所以分配并初始化你的数组。然后它应该工作。