Ошибка при возврате [anArray count] в numberOfRowsInComponent в UIPickerView - PullRequest
0 голосов
/ 28 июля 2011

У меня есть UIViewController, который имеет UIPickerView и UITableView.UIPicker состоит из 3 компонентов.

Когда я пытаюсь определить количество компонентов в каждом массиве, возвращая [anArray count], программа останавливается, не выдавая ошибку при загрузке UIViewController.

Когда я помещаю NSLogs в viewDidLoad: для [self.hours count], [self.minutes count] и [self.meridiem count], возвращается правильное количество значений.

- (void)viewDidLoad {

[super viewDidLoad];

NSMutableArray *tempHours = [NSMutableArray array];
for (NSInteger i = 0; i < 12; i++) [tempHours addObject:[NSNumber numberWithInteger:(i+1)]];
self.hours = [NSArray array];
hours = tempHours;
[tempHours release];

NSMutableArray *tempMinutes = [NSMutableArray array];
for (NSInteger i = 0; i <= 59; i++) [tempMinutes addObject:[NSNumber numberWithInteger:i]];
self.minutes = [NSArray array];
minutes = tempMinutes;
[tempMinutes release];

NSMutableArray *tempMeridiem = [NSMutableArray array];
for (NSInteger i = 0; i <= 1; i++) [tempMeridiem addObject:[NSNumber numberWithInteger:i]];
self.meridiem = [NSArray array];
meridiem = tempMeridiem;
[tempMeridiem release];

}

Теперь в pickerView:numberOfRowsInComponent:Component:, код останавливается без ошибки, если я пытаюсь вывести [anArray count] (где anArray - заполнитель для часов, минут и меридием).Если я установлю для numberOfRows целочисленное значение или component+1, все будет работать нормально.

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {

NSInteger numberOfRows;

if (component == 0) {
    // numberOfRows = component+1;
    numberOfRows = [self.hours count];
}
else if(component == 1) { 
    // numberOfRows = component+1;
    numberOfRows = [self.minutes count];
}
else { 
    // numberOfRows = component+1;
    numberOfRows = [self.meridiem count];
}

return numberOfRows;

}

У меня такое ощущение, что мои NSArrays (часы, минуты, меридием) не сохраняются, но выполняютсяАнализатор не показывает мне, что у меня есть утечки памяти в этом ViewController.

Любая помощь будет принята с благодарностью!

Ответы [ 3 ]

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

Вы создаете ненужные массивы и не сохраняете те, которые имеют значение.См. Ваш код:

self.hours = [NSArray array]; 
hours = tempHours; 
[tempHours release];

Здесь вы создали автоматически выпущенный массив и задали для него свойство self.hours (к которому, как мы надеемся, добавлено ключевое слово retain)Но затем на следующей строке вы получите доступ к ivar напрямую и установите его на tempHours.Затем вы отправляете сообщение о выпуске на номер tempHours, даже не сохранив его.Так как tempHours автоматически выпущен, он волшебным образом исчезнет при следующем сливе из пула автоматического выпуска.Я считаю, что вы хотели сделать:

self.hours = tempHours;

То же самое для других ваших коллекций массивов.

0 голосов
/ 29 июля 2011

Проблема была не во ViewController, который я пытался отобразить.Я просто скопировал интерфейс и файлы реализации в новый проект, и как только я его скомпилировал, все работало как сон.

Проблема в RootViewController моего проекта, который модально вызывает контроллер с UIPickerView.Видимо, у меня там утечка памяти.Исправление должно быть тривиальным.

Спасибо всем за помощь!

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

Эти строки неверны:

self.hours = [NSArray array];
hours = tempHours;

Вы должны просто использовать

self.hours = tempHours;

То, что происходило в вашем исходном коде, было:

  1. self.hours установлен в массив, созданный [NSArray array]. Назовите это a. a правильно сохраняется.

  2. сейчас hours установлено на tempHours. Это напрямую обращается к ивару, без использования установщика. Таким образом, он не сохраняет tempHours. a теряется и без правильного освобождения.

  3. tempHours освобождается. Его никто не хранит, поэтому он тоже освобожден.

Так что не делай этого. Вы хотите прочитать руководство по управлению памятью . Я не могу поверить, что Analyzer (ниже команды Build) не уловил эту ошибку ... возможно, вы хотели бы сообщить об ошибке команде LLVM по этому делу.

...