2011-03-03 6 views
2

으로 보내 주시면이 하나만 도와주세요. Objective C에서 지금까지 어떤 미친 행동을 보았지만이 하나가 나를 자살로 만듭니다. 음, 실제로는 ...iphone 메시지는 할당 해제 된 인스턴스

주소 할당 해제 된 개체 문제입니다.

시나리오 : 행을 선택하면 DetailView가 표시되고 피드가 UIWebView에 표시되는 RSS 피드가있는 tableView가 있습니다. DetailView 내에서 이전 및 다음 피드로 미끄러지는 기능이 필요하므로
을 저장하는 NSMutableDictionary로 DetailView를 초기화합니다. 1. 모든 NSMutableArray가 키 : @ "items"및
에서 피드합니다. 2.) NSNumber tableView에서 선택한 행의 인덱스가있는 positionInArray입니다.

후자는 현재 피드가있는 배열 인덱스의 값을 유지함으로써 이전 피드와 다음 피드로 스 와이프 할 수 있습니다. 이 값으로 내있는 TableView에서 positionInArray-1 또는

positionInArray + 1 ...

를로드 할 수 있습니다 나는이 예상대로

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
//Call an action only if the pressed cells are not the adMob ones 
if (indexPath.row != 0) { 
    NSMutableDictionary *theItem = [[NSMutableDictionary alloc] init]; 
    [theItem setValue:items forKey:@"items"]; 

    //Add the position of item in the items array to the NSDictionary for current item so it can be 
    //used in nextController to scroll to prev and next 

    NSNumber *positionInArray = [NSNumber numberWithInt:indexPath.row-1]; 
    [theItem setValue:positionInArray forKey:@"positionInArray"]; 

    DetailController *nextController = [[DetailController alloc] initWithItem:theItem]; 
    [self.navigationController pushViewController:nextController animated:YES]; 

    [nextController release]; 
    [positionInArray release]; 
    [theItem release]; 

}  

이제 모든 것이 작동합니다. 피드가있는 DetailView를 여는 TableView에서 행을 선택합니다. 왼쪽 및 오른쪽으로 스 와이프하면 문제없이 모든 피드가 표시됩니다. 그러나! 내가 마지막으로 공급 또는있는 TableView에서 마지막 전에 하나를 선택하면, 피드는 평소와 같이 제시하지만 내가하려고하면 왼쪽이나려면 오른쪽으로 스 와이프 내가받을 다음과 같은 오류 :

2011-03-03 10:50:15.039 RssReader[72137:207] Swipe Right Movement done! 
2011-03-03 10:50:15.041 RssReader[72137:207] *** -[CFNumber intValue]: message sent to deallocated instance 0x6240460 

내가 수 있도록 시도 좀비 가드의 malloc P
을 내가 선을 [positionInArray release] 또는 [theItem release] 응용 프로그램을 제거하는 경우 : 그러나 이것은 내가 가진 유일한 것은 ...

문제의 해결책은 정말 제가 심지어/해제가 무엇을 의미하는지 메모리 할당 이해한다 생각 만드는 것입니다입니다 어떤 문제없이 작동합니까 ??? 방법? 왜? 왜 오?

positionInArray 객체를 놓으면 다른 객체 NSMutableDictionarytheItem 내부를 전달할 수 없다는 것을 이해할 수 있습니다. 나는 그것을 (할당함으로써) 사본을 사용하고 있다고 생각했기 때문에 나는 척한다고 말한다.

또한, 내가 이해할 수없는 것은 :

  1. 는 왜 그렇지 않은 지난 이틀 동안 내가로드 피드 있다고 13 일을하고 있습니까?

  2. ItItem 개체를 공개하지 않으면 왜 작동합니까? 그 객체 위의 몇 줄이 * nextController를 초기화하는 데 사용되었다는 것을 의미하며, 거기에서 작업 할 로컬 복사본을 만들었습니까?

자세한 정보가 필요하면, 라인 [positionInArray release];

이 VAR를 제거 ... 사전에 감사합니다, L

답변

2

이 라인은 당신의 문제입니다. 그것은 당신이 그들을 풀어 놓을 책임이 있음을 의미합니다. NSNumber 인스턴스를 사용하는 경우 alloc으로 전화하지 않으므로 릴리스 할 책임이 없으므로 자동 릴리스됩니다. 스스로 풀어 주면 앱의 나중 단계에서 자동 풀이 풀릴 때 두 번째 할당 해제가되므로 디버깅하기 힘든 오류를 의미합니다.

자세한 내용은 the Memory Management Programming Guide

+1

을 읽어 주셔서 감사합니다. 첫 번째 게시물에서 볼 수 있듯이 해결했지만 왜이 오류가 발생했는지 전혀 알 수 없습니다. 나는이 모습을 보았어야했는데 해제 할 필요가없는 것은 _NSString_ 개체라고 생각했습니다. 질문은 지난 두 피드가 아닌 처음 13 개의 피드를 열 때 DetailView를 열 때 스 와이프 기능이 작동하는 이유는 무엇입니까? 첫 번째 게시물을 다시 읽으면 마지막 두 피드 중 하나를 열고 왼쪽/오른쪽으로 스 와이프 한 경우에만 문제가 발생한다는 것을 알 수 있습니다. – luigi7up

1

당신을 도울 수있는 무엇을 물어 나는 확실히 그것을 제공하겠습니다 유지되지 않습니다, 그것은 autoreleased입니다.

0

positionInArray을 출시 할 필요가 없습니다. 그것의 자동 풀어 놓인.다른 모든 변수를 보내고

NSNumber *positionInArray = [NSNumber numberWithInt:indexPath.row-1]; 

[positionInArray release]; 

당신은 alloc/init :

관련 문제