يتعطل جهاز iPhone عندما أقوم بتحرير وحدات التحكم في العرض المدفوعة "بشكل صحيح".

StackOverflow https://stackoverflow.com/questions/1230918

سؤال

لدي تطبيق يستند إلى وحدة التحكم في التنقل وأواجه مشكلة غريبة حيث يتسبب عدد قليل من عمليات دفع وحدة التحكم في العرض في حدوث أعطال عند "ظهور" وحدة التحكم في العرض.

لقد قمت بتضييق نطاقه إلى سطر التعليمات البرمجية الذي يطلق وحدة التحكم في العرض بعد دفعها إلى مكدس وحدة التحكم في التنقل.

الكود الخاص بي يبدو كالتالي:

SomeViewController *viewController = [[SomeViewController alloc] init];
[self.navigationController pushViewController:viewController animated:YES];
[viewController release];  //offending line

الآن هذا يكون رمز مناسب لإدارة الذاكرة، ولكن لسوء الحظ أتلقى خطأ "إرسال مزدوج مجاني إلى المثيل 0x....." (في بعض الحالات) ويتعطل تطبيقي.يحدث هذا عمومًا عندما أقوم بإخراج وحدة التحكم في العرض.

أنا أبحث عن اقتراحات بشأن ما يجب النظر إليه.انا عالق.

شكرا لك مقدما.

يحرر:هذه هي نتيجة تفريغ تتبع المكدس الذي اقترحه لويس أدناه.

عند الإصدار الأول، كان عدد الاحتفاظ به هو 13 (أعتقد أنه بسبب بعض التعليمات البرمجية الموجودة في فئات CocoaTouch الأساسية).في النهاية يصل الأمر إلى هذا:

2009-08-06 22:33:18.304 My App [26601:20b] ** RELEASE CALLED **
2009-08-06 22:33:18.306 My App [26601:20b] Retain count was : 1
0   My App                              0x000033ec start + 4700
1   CoreFoundation                      0x302042e8 CFRelease + 136
2   CoreFoundation                      0x30227249 CFNumberGetValue + 2937
3   CoreFoundation                      0x30204421 _CFRelease + 241
4   Foundation                          0x30506515 NSPopAutoreleasePool + 341
5   QuartzCore                          0x00b5436e
                                        CA_CGRectUnapplyInverseTransform_ +
                                        19738
6   QuartzCore                          0x00b54109
                                        CA_CGRectUnapplyInverseTransform_ +
                                        19125
7   CoreFoundation                      0x302454a0 CFRunLoopRunSpecific + 3696
8   CoreFoundation                      0x30244628 CFRunLoopRunInMode + 88
9   GraphicsServices                    0x32044c31 GSEventRunModal + 217
10  GraphicsServices                    0x32044cf6 GSEventRun + 115
11  UIKit                               0x309021ee UIApplicationMain + 1157
12  My App                              0x00002258 start + 200
13  My App                              0x000021c6 start + 54
14  ???                                 0x00000001 0x0 + 1
2009-08-06 22:33:18.307 My App [26601:20b] ########### DEALLOC
#
objc[26601]: FREED(id): message retainCount sent to freed

الكائن = 0xd09070

إذا قمت بحذف السطر المخالف أعلاه ([إصدار viewController]؛) فإن عدد الاحتفاظ يصل إلى 2 فقط ولا يتم إلغاء تخصيص المثيل أبدًا.

هل كانت مفيدة؟

المحلول

يتم إصداره في مكان آخر.إذا كنت تريد معرفة من المتصل، يمكنك فقط قطع المكالمات إلى الفصل الدراسي.هناك خيار آخر يتمثل في طباعة تتبع المكدس في الإصدار:

#include <execinfo.h>
#include <stdio.h>

- (void) release {
  void* callstack[128];
  int i, frames = backtrace(callstack, 128);
  char** strs = backtrace_symbols(callstack, frames);
  for (i = 0; i < frames; ++i) {
    printf("%s\n", strs[i]);
  }
  free(strs);

  [super release];
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top