TableViewController - получение данных из базы данных - PullRequest
0 голосов
/ 13 июля 2010

У меня проблема с моим TableController.

Когда я вызываю cellForRowAtIndexPath (), я могу получить информацию из класса Database с помощью:

myGroupsAppDelegate *appDelegate = (myGroupsAppDelegate *)[[UIApplication sharedApplication] delegate]; 
myGroupsDB *mgdb = [ appDelegate.groups_db objectAtIndex:indexPath.row ];   
cell.textLabel.text = mgdb.group_name;
[mgdb release];

, но если я пытаюсь вызвать то же самое из didSelectRowAtIndexPath (), я получаю ошибку. Мне нужно передать два значения в представление, и я использую этот код:

SingleGroupView *sgv = [[SingleGroupView alloc] initWithNibName:@"SingleGroupView" bundle:[NSBundle mainBundle]];

myGroupsAppDelegate *appDelegate = (myGroupsAppDelegate *)[[UIApplication sharedApplication] delegate];
myGroupsDB *mgdb = [ appDelegate.groups_db objectAtIndex:indexPath.row ];

sgv.groupID = mgdb.id_group;
sgv.groupName = mgdb.group_name;

[mgdb release];

Когда я пытаюсь назначить mgdb.id_group для sgv.groupID, я получаю EXC_BAD_ACCESS. Кажется, что MGDB пуст.

-------------- ИЗМЕНЕНИЕ ------------------

После Build and Analyze компилятор показал «Неправильное уменьшение числа ссылок объекта, который не является владельцем на данный момент». Но я создаю здесь, разве это не локально? Поэтому я добавил удержание:

myGroupsDB *mgdb = [[ appDelegate.groups_db objectAtIndex:indexPath.row ] retain];

и теперь это работает, но, если я пытаюсь вызвать тот же код (просто нажав на строку, изменить вид, вернуться и снова нажать строку), приложение завершает работу без журнала и с тем же сообщением.

Есть предложения?

спасибо, Andrea

Ответы [ 2 ]

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

Похоже, что вы чрезмерно отпускаете объект mgdb.

Если вы не получаете объект от метода, имя которого начинается с alloc, new, и если вы не отправляете ему сообщение retain, это означает, что вы не«владеть» объектом, и вы не должны release его.

Вы можете прочитать больше в Руководство по программированию управления памятью .

Примечание: когда вы получаете EXC_BAD_ACCESS, это означает, что вы обращаетесь к зоне памяти, которой вы не являетесьразрешено (в этом случае вам не разрешен доступ к нему, потому что он, вероятно, был освобожден).

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

Я нашел (я? Ты) решение.

cellForRowAtIndexPath ():

myGroupsAppDelegate *appDelegate = (myGroupsAppDelegate *)[[UIApplication sharedApplication] delegate];
myGroupsDB *mgdb = (myGroupsDB*)[ appDelegate.groups_db objectAtIndex:indexPath.row ];

cell.textLabel.text = mgdb.group_name;

и didSelectRowAtIndexPath ():

myGroupsAppDelegate *appDelegate = (myGroupsAppDelegate *)[[UIApplication sharedApplication] delegate];
myGroupsDB *mgdb = (myGroupsDB *)[appDelegate.groups_db objectAtIndex:indexPath.row];

Я удалил оба [релиза], потому что, как описано в Руководстве по программированию управления памятью, у меня нет экземпляра mgdb, поэтому я не несу ответственности за повторную передачу права собственности. Итак, я не знаю, почему не обязательно создавать новый экземпляр в памяти с помощью alloc или newObject, но, если я не владелец, я не освобождаю объект. Я также добавляю кастинг mgdb, не обязательно, но это хорошая практика.

До свидания, Andrea

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