(iOS)NSMutableArray作为属性addObject什么都不做

时间:2012-02-20 06:51:27

标签: objective-c nsmutablearray

我有UIViewController的子类,NSMutableArray作为属性,可用作UITableView的数据源。我在故事板中创建了一个类的实例。

我想使用addObject:方法填充数组,但如果我尝试,则数组始终返回(null)

我读到@synthesize没有初始化数组,我可能需要覆盖-init并在那里初始化NSMutableArray-init永远不会被调用。

这应该如何运作?

3 个答案:

答案 0 :(得分:5)

您需要创建NSMutableArray的实例并将其分配给该属性。

由于具有属性的对象是在故事板中创建的UIViewController,因此您可以在几个不同的位置执行此操作。您可以覆盖initWithCoder:awakeFromNibviewDidLoad

如果您覆盖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既没有分配。所以分配并初始化你的数组。然后它应该工作。