2010-07-28 3 views
0

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

@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];

    он падает на этой линии. Зачем?

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

ответ

1

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

serverList = [[NSMutableArray alloc] init]; 

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

0

Обратите внимание, что емкость не означает, что в массиве нет объектов. Использование -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.

+0

спасибо, alex! когда я использую 'serverList = [[NSMutableArray alloc] init];' кажется, отлично работает. почему вы говорите, что использование «severList» вместо «self.serverList» не будет работать? – BeachRunnerFred

+0

Изучите значение 'serverList' вне метода, в котором вы устанавливаете' serverList = [[NSMutableArray alloc] init] '. 'NSLog' на нем в отдельном методе. –

+0

Поскольку вы« сохраняете »свой массив, также убедитесь, что вы' autorelease' 'init'-ed array, или у вас будет утечка памяти. –

1

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

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

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

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

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

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

+0

Я не уверен, что вы ответили на любую его часть вообще – 2010-07-28 19:59:13

+1

Его вторая часть вопроса касается вопросов управления базой памяти. –

Смежные вопросы