سؤال

لذلك في جهاز التحكم في رأيي، قمت بتشغيل التعليمات البرمجية لملء الكائنات NSArray من كائنات العملاء (الطبقة المخصصة). يحتوي هذا الفصل المخصص على كائنات من فئة مخصصة أخرى تسمى العنوان (لدى العميل عنوان الفواتير وعنوان الشحن). في وحدة تحكم العرض عند تحديد العميل في القائمة، يمر وحدة تحكم عرض جديد كائن عميل، مثل ذلك:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    InfoViewController *customerinfoViewController = [[InfoViewController alloc] initWithStyle:UITableViewStyleGrouped andCustomer:[[[customers objectAtIndex:indexPath.section] objectAtIndex:indexPath.row] retain]];
    [self.navigationController pushViewController:customerinfoViewController animated:YES];
    [customerinfoViewController release];
}

في المرة الأولى التي أزور فيها وحدة تحكم الرؤية هذه أثناء تشغيل التطبيق، فإنه يعمل بشكل جيد. ومع ذلك، عندما أعد إعادة النظر في وحدة تحكم الرأي، يحدث شيء مثير للاهتمام. تعطل التطبيق، مع محدد محدد غير المعترف بها إلى مثيل 0x00 عاتما. باستخدام ميزة تصحيح الماوس Mouseover في Xcode، أجد أن الكائن الأول لمتغير ShipAddress الخاص بالعميل قد تم تغيير نوعه من NSSTRING إلى NSIndExPath. هذا لا يحدث كائن BillAddress للعميل. أي شخص لديه أي فكرة عما يجري هنا؟ يبدو أنني قد أكون مشكلات لإدارة الذاكرة ولكنني بالتأكيد أود التأكيد على ذلك قبل أن تمزق الشفرة التي تتبع فيها جميع الاحتفاظ والإصدارات ....

تحرير: مزيد من المعلومات هنا. مع التعليمات البرمجية التالية، لدي nsmutablerray على مستوى الفصل. عند كل تكرار للحلقة، أنا حلقات من خلال العقد في XML (والتي تعمل بشكل جيد). في كل مرة يتم فيها اكتشاف خطاب جديد كحرف أول من الاسم، أقوم بإنشاء ضابط صلب جديد وإضافة العميل إليه، وبالتالي ملء مستوى NSMutablerray (العملاء) مع صوباء عملاء لكل حرف من الحروف الأبجدية المكتشفة. سؤالي عن الاحتفاظ والإصدارات من كائن عملاء ركوب الدراجات. يقول Clang Static إن هناك خطأ في الإفراط في الاحتفاظ على العميل، ولكن عندما أقوم بإصلاحه وفقا ل Clang، تعطل الحلقة. ما يعطي؟ الرمز المرتبط أدناه:

DDXMLDocument *rootDoc = [[[DDXMLDocument alloc] initWithData:xmlData options:0 error:nil] autorelease];
NSArray *elems = [rootDoc nodesForXPath:@"QBXML/QBXMLMsgsRs/CustomerQueryRs/CustomerRet" error:nil];
DDXMLNode *node;
sectionTitles = [[[NSMutableArray alloc] initWithCapacity:1] retain]; // Letters for UITableView section titles
NSMutableArray *subArray;
NSString *lastchar = @"A";
NSString *testchar; 
int indexCount = -1;
customers = [[[NSMutableArray alloc] initWithCapacity:[elems count]] retain];
Customer *newCust;
for (int i = 0; i < [elems count]; i++) {
    node = [elems objectAtIndex:i];
    newCust  = [[Customer alloc] initWithCustomerRetNode:node];
    testchar = [[newCust fullName] substringToIndex:1];
    if (i == 0 || ![[testchar uppercaseString] isEqualToString:lastchar]) {
        [sectionTitles addObject:testchar];
        lastchar = testchar;
        indexCount++;
        subArray = [[NSMutableArray alloc] initWithCapacity:1];
        [customers addObject:subArray];
        [subArray release];
        [[customers lastObject] addObject:[newCust retain]];
    }
    else {
        [[customers lastObject] addObject:[newCust retain]];
    }
    [newCust release];
}

ملاحظة: يعمل هذا الرمز في معظمها، لكن Clang لا يحب ذلك.

تحرير: يتم تعيين العناوين في فئة العميل مثل ذلك (والتي الآن لا تعمل بعد إصلاحات Clang)

...
else if ([tempname isEqualToString:@"BillAddress"])
  billAddress = [billAddress initWithAddressNode:tempnode];
else if ([tempname isEqualToString:@"ShipAddress"])
  shipAddress = [shipAddress initWithAddressNode:tempnode];
...
هل كانت مفيدة؟

المحلول

يبدو أنك تواجه مشكلة في الإفراج، لذلك نعم إدارة الذاكرة، قد تكون قد تكون مبادلة أن الصفيف تقوم بتخزين الكائنات الخاصة بك. يجب أن تذهب وننظر من خلال التعليمات البرمجية والعثور على المصدر. أيضا باستخدام Clang Static Analyzer قد يكون مساعدتك.

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