나는 매우 이상한 문제가 있으며 그 이유에 대한 단서가 없습니다. 단순히 NSString과 NSURL을 저장하는 클래스가 있습니다. 이러한 클래스가 많이 있으므로 수정할 수있는 배열에 저장할 수 있습니다.예기치 않게 NSURL 값이 해제 됨
이 배열은 테이블 뷰를 채우는 데 사용됩니다. 사용자가 표 셀에 도달하면 배열에서 목록 클래스 중 하나를 가져 와서 해당 URL 속성을 가져온 다음 자세히보기로 전달합니다. 이것은 99 %의 시간 동안 잘 동작하지만, 가끔씩 지나가는 URL 속성이 해제 된 다른 1 %의 시간이 작동합니다.
는 특히 디버거의 NSURL은 "잘못된 요약"라고하고 URLString는 속성 내가이 NSURL을 해제 모든 장소를 주석 한""말했다. 이상하게도 같은 클래스의 NSString 변수는 같은 원치 않는 동작을 겪지 않습니다.
// list data
@interface ListData : NSObject {
NSURL *URL;
NSString *Title;
}
@property(nonatomic,retain) NSURL *URL;
@property(nonatomic,copy) NSString *Title;
@end
#import "ListData.h"
@implementation ListData
@synthesize URL;
@synthesize Title;
-(void)dealloc
{
[URL release];
[Title release];
[super dealloc];
}
@end
// table delegate method
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
ListData *rld=nil;
rld=[listDataArray objectAtIndex:indexPath.row];
if (self.listView) {
//[remixView closeRemix];
[self.listView release];
self.listView=nil;
}
// occassionaly the value of rld.URL is being released somehow
self.listView = [[ListView alloc] showWithData:rld.URL ];
self.listView.title = rld.remixTitle;
[table.navigationController pushViewController:listView animated:YES];
}
//population of list array
listArray =[[NSMutableArray alloc]init];
while (listelement!=nil) {
listData *rld = [listData alloc];
[rld setURL:[NSURL URLWithString:[TBXML textForElement:[TBXML childElementNamed:@"url" parentElement:listelement]]]];
[rld setTitle:[TBXML textForElement:[TBXML childElementNamed:@"title" parentElement:listelement]]];
[listArray addObject:rld];
[rld release];
listelement = [TBXML nextSiblingNamed:@"list" searchFromElement:listelement];
}
EDIT 1
은 내가 문제를 발견하지만 세드릭 정말 이해 해달라고 생각합니다.
listview showWithData 메서드에서 url을 전달하고이를 nsurl var에 할당했습니다.
-(id) showWithData:(ListData *) data;
{
if ( [super init]) {
baseURL=data.URL;
}
base을은 (내 생각 TBXML의 창자에서) 어떻게 든 출시되고되었으며이 출시 될 부모의 tableview 클래스에서 NSURL을 만들고 있었다.
showWithData 메서드를 다음과 같이 변경하여 문제가 해결되지 않았습니다. '사본'을 사용하면 원본 NSURL이 공개되지 못하는 것으로 보입니다. 내가 그것을 이해하지 못하는 이유는 내가 디버거를 검사 할 때 NSURl이 메소드와 baseURL에 전달 될 때 모두 동일한 메모리 주소를 가지기 때문이다. 누군가가 이것을 설명 할 수 있습니까?
-(id) showWithData:(xListData *) data;
{
if ( [super init]) {
self.baseURL=[data.URL copy];
}
listDataArray는 어떻게 초기화합니까? – hennes
개체가 해제 중임을 의미합니까? 나쁜 액세스 충돌이 발생합니까? 포인터가 갑자기 null을 가리키고 있습니까? 아니면 빈 값을 포함하는 유효한 객체를 가리키고 있습니까? –
은 유효한 값이 비어있는 유효한 개체입니다. – dubbeat