문제

따라서 View Controller에서는 NSARRAY OF CUSTUME (Custom Class) 객체를 채우기 위해 코드를 실행합니다. 이 사용자 정의 클래스에는 주소라는 다른 사용자 정의 클래스의 개체가 있습니다 (고객은 청구 주소와 배송 주소가 있습니다). 목록의 고객을 선택할 때 View Controller에서 다음과 같은 새보기 컨트롤러를 전달합니다.

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

응용 프로그램을 실행하는 동안이보기 컨트롤러를 처음 방문하면 제대로 작동합니다. 그러나 View Controller를 다시 방문하면 흥미로운 일이 발생합니다. 인식되지 않은 선택기가 인스턴스 0x00wather에 전송되면서 응용 프로그램 충돌이 발생합니다. Xcode에서 마우스 오버 디버깅 기능을 사용하면 고객의 Shipaddress 변수의 첫 번째 객체가 NSString에서 NSIndexPath로 유형이 변경되어 있음을 알게되었습니다. 이것은 고객의 Billaddress 객체에 발생하지 않습니다. 누구든지 여기서 무슨 일이 일어나고 있는지 아는 사람이 있습니까? 메모리 관리 문제가있는 것처럼 보이지만 모든 보유 및 릴리스를 추적하는 코드를 찢어 버리기 전에 확인을 확실히하고 싶습니다 ....

편집 : 추가 정보는 여기에 있습니다. 다음 코드를 사용하면 클래스 수준에 NSMutableARRAY가 있습니다. 루프의 각 반복 할 때 XML의 노드를 통해 루프를하고 있습니다 (잘 작동합니다). 새 문자가 이름의 첫 번째 문자로 감지 될 때마다 새 서브 어레이를 만들고 고객을 추가하여 감지 된 알파벳의 각 문자에 대해 고객의 서브 어레이로 내 클래스 수준의 NSMutableARRAY (고객)를 채우십시오. 내 질문은 사이클링 고객 객체의 보유 및 릴리스에 관한 것입니다. 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은 그것을 좋아하지 않습니다.

편집 : 고객 클래스의 주소는 SO처럼 할당됩니다 (이제 Clang 수정 후 작동하지 않음).

...
else if ([tempname isEqualToString:@"BillAddress"])
  billAddress = [billAddress initWithAddressNode:tempnode];
else if ([tempname isEqualToString:@"ShipAddress"])
  shipAddress = [shipAddress initWithAddressNode:tempnode];
...
도움이 되었습니까?

해결책

오버 릴리스 문제가있는 것처럼 들리므로 메모리 관리, 객체를 저장하는 배열을 과도하게 상쇄 할 수 있습니다. 코드를 살펴보고 소스를 찾아야합니다. 또한 Clang 정적 분석기를 사용하는 것이 도움이 될 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top