(iOS) NSMutableArray как свойство addObject ничего не делает - PullRequest
2 голосов
/ 20 февраля 2012

У меня есть подкласс UIViewController с NSMutableArray в качестве свойства для использования в качестве источника данных для UITableView. Я создаю экземпляр класса в моей раскадровке.

Я хочу заполнить массив методом addObject:, но если я попробую, массив всегда вернет (null).

Я прочитал, что @synthesize не инициализирует массив, и мне может потребоваться переопределить -init и инициализировать там NSMutableArray, но -init никогда не вызывается.

Как это должно работать?

Ответы [ 3 ]

5 голосов
/ 20 февраля 2012

Вам необходимо создать экземпляр NSMutableArray и присвоить его свойству.

Поскольку объект со свойством - это UIViewController, созданный в раскадровке, вы можете сделать это несколькими различными способами.мест.Вы можете переопределить initWithCoder:, или awakeFromNib, или viewDidLoad.

Если вы переопределите initWithCoder:, обязательно вызовите метод super.

Если высделайте это в viewDidLoad, массив не будет создан, пока не будет загружено представление, что не должно происходить сразу.

Я рекомендую сделать это в awakeFromNib:

@synthesize myArray = _myArray;

- (void)awakeFromNib {
    _myArray = [[NSMutableArray alloc] init];
}

Другим вариантом является ленивое создание массива путем переопределения метода get свойства:

@synthesize myArray = _myArray;

- (NSMutableArray *)myArray {
    if (!_myArray)
        _myArray = [[NSMutableArray alloc] init];
    return _myArray;
}

Если вы сделаете это, очень важно, чтобы вы всегда обращались к массиву с помощью метода getter(self.myArray или [self myArray]) и никогда путем прямого доступа к переменной экземпляра (_myArray).

2 голосов
/ 20 февраля 2012

Вот что понадобится вашему коду:

@interface BlahBlah : UIViewController
@property (...) NSMutableArray *myArray;
@end

Сначала *myArray это просто указатель, равный нулю. Вы не можете использовать это как массив еще. Это должно быть установлено на действительный экземпляр 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 относительно нескольких / назначенных инициализаторов .

0 голосов
/ 20 февраля 2012

@ Синтез также не делать.Так что выделите и инициализируйте ваш массив.Тогда это должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...