viewDidLoad падает при возврате из фона - PullRequest
0 голосов
/ 08 августа 2011

Я недавно включил многозадачность с приложением (не закрывается, когда фон), и теперь пользователи получают сбои в непредсказуемое время.Журналы сбоев показывают, что сбои происходят в viewDidLoad.

Мой подход viewDidLoad, вероятно, все равно нуждается в переосмыслении.У меня есть некоторые из представлений, загруженных из XIB, затем я строю остальную часть иерархии программно (включая некоторые автоматически выпущенные UIButton, которые я считаю виновником сбоя).Любое понимание того, что может происходить и как лучше подойти к этому вопросу?

Вот типичный отчет о сбое:

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x49ef527e
Crashed Thread:  0

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libobjc.A.dylib                 0x32da1c9a objc_msgSend + 18
1   App                         0x0000a890 -[EntryViewController viewDidLoad] (EntryViewController.m:270)
2   UIKit                           0x3241ff08 -[UIViewController view] + 104
3   UIKit                           0x3242c1ce -[UIViewController viewControllerForRotation] + 34
4   UIKit                           0x3242ca40 -[UIViewController shouldWindowUseOnePartInterfaceRotationAnimation:] + 8
5   UIKit                           0x3242c9a8 -[UIWindow _clientsForRotation] + 236
6   UIKit                           0x32494fea -[UIWindow _setRotatableClient:toOrientation:updateStatusBar:duration:force:] + 70
7   UIKit                           0x32493f9e -[UIWindowController transition:fromViewController:toViewController:target:didEndSelector:] + 946
8   UIKit                           0x324bec50 -[UIViewController _dismissModalViewControllerWithTransition:from:] + 1444
9   UIKit                           0x324be5e0 -[UIViewController dismissModalViewControllerWithTransition:] + 596
10  UIKit                           0x324be366 -[UIViewController dismissModalViewControllerAnimated:] + 86

Что было бы наиболее полезным, так это краткое изложение лучших практик управленияиерархия представлений в цикле загрузки / выгрузки.Я знаю, что IBOutlet должен сохранять свойства, для которых в viewDidUnload установлено значение nil.

Но как насчет программно созданных UIView и UIControl?Хорошо, чтобы создать локальный объект в viewDidLoad, добавить его в представление и выпустить, не беспокоясь об этом снова?Хорошо, чтобы использовать инициализируемые виды в ivars, которые я не выпускаю до dealloc?Хорошо, чтобы использовать автоматически выпущенные представления, которые я никогда не освобождаю?

Вот некоторые из моих viewDidLoad:

imagebg = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"background.png"]];
[self.view addSubview:imagebg];
[self positionBackgroundAt:0];

UIButton *flickbtn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
[flickbtn addTarget:self action:@selector(flick:) forControlEvents:UIControlEventValueChanged];
[self.view addSubview:flickbtn];
[flickbtn release];

// SET UP UPPER LEFT BUTTONS
upperLeftButton0 = [UIButton buttonWithType:UIButtonTypeCustom];
[upperLeftButton0 setFrame:CGRectZero];
[self.view addSubview:upperLeftButton0];
upperLeftButton1 = [UIButton buttonWithType:UIButtonTypeCustom];
[upperLeftButton1 setFrame:CGRectZero];
[self.view addSubview:upperLeftButton1];

// SET UP DISPLAY
displayimg = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"newdisplay.png"]];
[displayimg setCenter:CGPointMake(CGRectGetMidX(self.view.frame),CGRectGetMaxY(self.view.frame) - 57)];
[self.view addSubview:displayimg];
[displayimg release];

...

Мой viewDidUnload просто устанавливает все IBOutlets на nil.

Спасибо.

1 Ответ

0 голосов
/ 10 августа 2011

Без вашего кода и возникающей ошибки вот мое лучшее предложение для возможных проблем с памятью: во-первых, используйте функцию «Анализ» из меню «Продукт» и устраните все выданные предупреждения. Если у вас все еще есть проблема, профилируйте ее и используйте средство распределения или утечки для отслеживания вашей памяти. Наконец, отладка разделов, имеющих проблемы, и просмотр стека памяти, чтобы увидеть, что на самом деле есть в viewDidLoad по сравнению с тем, когда происходит сбой приложения. Недавно я случайно использовал assign вместо retain в одном из моих свойств и столкнулся с аналогичной проблемой. Как указано выше, убедитесь, что вы установили ноль своих освобожденных объектов. Самый быстрый способ освободить и обнулить сохраненные свойства:

self.myProperty = nil;
...