يتعطل جهاز iPhone عندما أقوم بتحرير وحدات التحكم في العرض المدفوعة "بشكل صحيح".
-
22-07-2019 - |
سؤال
لدي تطبيق يستند إلى وحدة التحكم في التنقل وأواجه مشكلة غريبة حيث يتسبب عدد قليل من عمليات دفع وحدة التحكم في العرض في حدوث أعطال عند "ظهور" وحدة التحكم في العرض.
لقد قمت بتضييق نطاقه إلى سطر التعليمات البرمجية الذي يطلق وحدة التحكم في العرض بعد دفعها إلى مكدس وحدة التحكم في التنقل.
الكود الخاص بي يبدو كالتالي:
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];
}