Frage

Also meine Ansicht-Controller, ich laufe Code eine NSArray von Kunden (benutzerdefinierte Klasse) Objekte zu füllen. Diese benutzerdefinierte Klasse hat Objekte, die von einer anderen benutzerdefinierter Klasse namens Adresse sind (ein Kunde eine Rechnungsadresse und eine Lieferadresse). Im View-Controller, wenn ein Kunde in der Liste ausgewählt wird, übergibt er einen neuen View-Controller ein Kundenobjekt, etwa so:

- (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];
}

Das erste Mal, dass ich diesen View-Controller besuchen, während die Anwendung ausgeführt wird, es funktioniert gut. Allerdings, wenn ich die View-Controller erneut, etwas interessantes passiert. Die Anwendung abstürzt, mit nicht erkannten Selektor gesendet Instanz 0x00whatever. Mit Hilfe der Mouseover-Debug-Funktion in xCode, ich finde, dass das erste Ziel des shipAddress Variable des Kunden seine Art von NSString zu NSIndexPath geändert hat. Dies geschieht nicht auf den billAddress Sache des Kunden. Wer noch keine Ahnung, was hier vor sich geht? Es scheint, wie ich Probleme mit der Speicherverwaltung werden kann, aber ich würde auf jeden Fall eine Bestätigung wie diese auf, bevor ich zerreißen meinen Code aufzuspüren alle behält und gibt ....

EDIT: Mehr Informationen hier. mit dem folgenden Code, habe ich auf der Klassenebene ein NSMutableArray. Bei jeder Iteration der Schleife, ich Schleife durch Knoten in XML (das funktioniert). Jedes Mal, wenn ein neuer Brief als die ersten Buchstaben des Namen erkannt wird, erstelle ich ein neues Sub-Array und fügen Sie die Kunden, um es, so meinen Klasse-Level-Füllung NSMutableArray (Kunden) mit Sub-Arrays von Kunden für jeden Buchstaben des Alphabets erkannt. Meine Frage bezieht sich auf die behält und Releases des Radsport Kundenobjekt. Clang Static sagt, dass es eine Überhalte Fehler auf den Kunden, aber wenn ich es beheben nach Clang, die Schleife stürzt ab. was gibt? Ähnlicher Code unten:

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];
}

Hinweis: Dieser Code funktioniert in den meisten Fällen, aber Klappern mag es nicht

.

EDIT: Adressen in der Customer-Klasse sind wie so zugewiesen (was jetzt nicht funktioniert nach Clang Fixes)

...
else if ([tempname isEqualToString:@"BillAddress"])
  billAddress = [billAddress initWithAddressNode:tempnode];
else if ([tempname isEqualToString:@"ShipAddress"])
  shipAddress = [shipAddress initWithAddressNode:tempnode];
...
War es hilfreich?

Lösung

obwohl

Es klingt wie Sie ein über Release Problem haben, also ja Speicherverwaltung, könnten Sie das Array overreleasing Sie Ihre Objekte zu speichern in.Cant wirklich aus dem Code-Snippet erzählen. Youll haben, um den Code zu gehen und schauen und die Quelle zu finden. Auch mit Clang Static Analyzer könnte Ihnen behilflich sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top