Как выяснить, к какому UIView принадлежит зомби CALayer в инструменте Zombies Xcode 4? - PullRequest
0 голосов
/ 29 ноября 2011

Мой день испортил это сообщение:

*** -[CALayer retainCount]: message sent to deallocated instance 0x656b260

Поскольку в этом случае я сам не создаю CALayer, это может быть только CALayer для UIView, который может быть чем угодно, от UIButton до UISlider.

Итак, я получил отличный ответ от Джеффа на мой вопрос о том, как отследить это в Xcode 4 .

Джефф рекомендовал нажать Command + I, чтобы запустить Profiler, а затем выбрать инструмент Zombies. Действительно, инструмент Зомби остановился на этом CALayer и бросил в меня более полезную трассировку стека.

Однако, Stack Trace не так полезен, так как он не сообщает мне , какой объект, которым действительно был Зомби. У каждого UIView есть CALayer, но дело в том, что я сам не создаю эти экземпляры CALayer. Поэтому в этом случае цель состоит в том, чтобы узнать, к какому UIView (кнопке, ползунку и т. Д.) Принадлежит CALayer.

   0 libSystem.B.dylib calloc
   1 libobjc.A.dylib class_createInstanceXcode4
   2 CoreFoundation +[NSObject(NSObject) allocWithZone:]
   3 CoreFoundation +[NSObject(NSObject) alloc]
   4 UIKit -[UIView _createLayerWithFrame:]
   5 UIKit UIViewCommonInitWithFrame
   6 UIKit -[UIView initWithFrame:]
   7 UIKit -[UIControl initWithFrame:]
   8 UIKit -[UIButton initWithFrame:]
   9 UIKit +[UIButton buttonWithType:]
  10 TestApp +[CCButton buttonWithNormalImage:pressedImageName:] /Users/tom/Documents/testcomp/Projects/TestApp/Xcode4/Classes/CCButton.m:267
  11 TestApp -[ConfigView setupCommitBlade] /Users/tom/Documents/testcomp/Projects/TestApp/Xcode4/Classes/ConfigView.m:606
  12 TestApp -[ConfigView initWithRootVC:] /Users/tom/Documents/testcomp/Projects/TestApp/Xcode4/Classes/ConfigView.m:714
  13 TestApp -[TestAppViewController loadConfigViewIfNeeded] /Users/tom/Documents/testcomp/Projects/TestApp/Xcode4/Classes/TestAppViewController.m:69
  14 TestApp -[TestAppViewController viewDidLoad] /Users/tom/Documents/testcomp/Projects/TestApp/Xcode4/Classes/TestAppViewController.m:293
  15 UIKit -[UIViewController view]
  16 TestApp -[TestAppAppDelegate application:didFinishLaunchingWithOptions:] /Users/tom/Documents/testcomp/Projects/TestApp/Xcode4/Classes/TestAppAppDelegate.m:238
  17 UIKit -[UIApplication _callInitializationDelegatesForURL:payload:suspended:]
  18 UIKit -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:]
  19 UIKit -[UIApplication handleEvent:withNewEvent:]
  20 UIKit -[UIApplication sendEvent:]
  21 UIKit _UIApplicationHandleEvent
  22 GraphicsServices PurpleEventCallback
  23 CoreFoundation __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__
  24 CoreFoundation __CFRunLoopDoSource1
  25 CoreFoundation __CFRunLoopRun
  26 CoreFoundation CFRunLoopRunSpecific
  27 CoreFoundation CFRunLoopRunInMode
  28 UIKit -[UIApplication _run]
  29 UIKit UIApplicationMain
  30 TestApp main /Users/tom/Documents/testcomp/Projects/TestApp/Xcode4/main.m:14
  31 TestApp start

Может быть, кто-то может указать учебник или видео, которые показывают, как профилировать проблему, как это в Xcode4? Насколько я помню, Xcode 3 действительно указал , какой объект это был, но здесь я просто не вижу, где находится зло. Должно быть какое-то практическое правило, как правильно интерпретировать эту трассировку стека / или веская причина, по которой инструмент Zombies не просто указывает на строку кода, где появился зомби.

1 Ответ

1 голос
/ 29 ноября 2011

Необходимо включить ведение журнала в стеке malloc на панели «Редактировать схему»> «Диагностика». Затем, когда вы получите сообщение об ошибке зомби, вы можете сделать это в консоли gdb:

info malloc-history -exact 0x656b260

Используйте адрес из сообщения зомби, конечно. Может отличаться при каждом запуске.

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