Как я должен инициализировать массив, который является членом UITableViewController? - PullRequest
0 голосов
/ 28 июля 2010

Источником данных для моего табличного представления является обычный NSMutableArray, который будет заполняться при запуске приложения, но будет пустым при первой загрузке табличного представления.Интерфейс класса выглядит следующим образом ...

@interface ViewController_iPhone : UITableViewController  {

    NSMutableArray *serverList; 
}

@property (retain, readonly) NSMutableArray *serverList;

@end

Мои вопросы ...

  1. В настоящее время я инициализирую его в методе viewDidLoad примерно так ...

    serverList = [[NSMutableArray alloc] initWithCapacity: 1];

    Я делаю это так, потому что массив должен быть действительным, чтобы мой метод numberOfRowsInSection избегал сбоев при чтенииcount массива (который будет нулевым) при первой загрузке представления.Мой нынешний подход к использованию initWithCapacity выглядит немного неуклюжим, поскольку мне просто нужен пустой, но допустимый объект массива, который будет возвращать нулевое значение счетчика при загрузке представления.Как мне инициализировать мой массив serverList?

  2. Во время игры я заметил, что когда я пытаюсь инициализировать массив serverList таким образом ...

    serverList = [NSMutableArray arrayWithCapacity: 1];

    в этой строке происходит сбой.Почему?

Заранее благодарим за помощь!

Ответы [ 3 ]

1 голос
/ 28 июля 2010

Вот ключевая концепция, чтобы узнать о переменных и свойствах-членах: переменные-члены не совпадают с свойствами.

То есть при доступе к переменной-члену в вашем классе:
serverList = [NSArray array]; не то же самое, что self.serverList = [NSArray array];

serverList само по себе означает, что вы обращаетесь к нему напрямую.
self.serverList означает, что вы используете методы получения / установки для доступа к нему.

Обычно это не так уж важно при работе с базовыми типами переменных.Тем не менее, когда ваше свойство использует retain или copy, это означает, что ваш метод установки автоматически сохранит его при использовании, но не сделает это при непосредственном доступе к нему.

Это означает:serverList = [NSArray array]; не сохранит массив.self.serverList = [NSArray array]; сохранит массив.

Следует отметить, что [NSMutableArray arrayWithCapacity:1]; (и 99% других методов, которые не выделены) вернут объект, который был автоматически освобожден.Если вы хотите сохранить его для последующего использования, как это необходимо в этом случае, вы должны сохранить его в той или иной форме.

1 голос
/ 28 июля 2010

Я как-то упустил самый простой подход и обнаружил, что когда я просто создаю массив, вот так ...

serverList = [[NSMutableArray alloc] init];

и отпустите его методом dealloc, все отлично работает!

0 голосов
/ 28 июля 2010

Обратите внимание, что емкость не означает, что какие-либо объекты находятся в массиве.Использование -initWithCapacity: просто выделяет кусок пространства для массива.В массиве нет ничего, даже с ненулевой емкостью.

Однако все инициализаторы:

self.serverList = [[[NSMutableArray alloc] init] autorelease];
self.serverList = [[[NSMutableArray alloc] initWithCapacity:capacity] autorelease];
self.serverList = [NSMutableArray array];
self.serverList = [NSMutableArray arrayWithCapacity:capacity];

должны все работать.

Убедитесь, что вы указали self, чтобы получить доступ к свойству.Использование serverList само по себе не будет работать.

Убедитесь, что вы autorelease любой alloc-init свойства, которое вы сохраняете, в противном случае у вас будет утечка памяти.

Вы делаетене нужен массив с указанной емкостью.Это просто удобство производительности для выделения смежной памяти и полезно, если у вас есть приблизительное представление о том, сколько места потребуется вашему массиву заранее.Массив, созданный с помощью alloc-init, также будет пустым с count, равным нулю.

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