2011-03-23 6 views
1

나는 매우 이상한 문제가 있으며 그 이유에 대한 단서가 없습니다. 단순히 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]; 
} 
+0

listDataArray는 어떻게 초기화합니까? – hennes

+0

개체가 해제 중임을 의미합니까? 나쁜 액세스 충돌이 발생합니까? 포인터가 갑자기 null을 가리키고 있습니까? 아니면 빈 값을 포함하는 유효한 객체를 가리키고 있습니까? –

+0

은 유효한 값이 비어있는 유효한 개체입니다. – dubbeat

답변

0

이것은 전혀 도움이되지 않을 수도 있지만 시도해 볼 수있는 내용입니다. rld.URL을 통해 URL 변수에 액세스하는 대신 다음과 같이 추가하십시오.

그리고 변수 값에 얻을

self.listView = [[ListView alloc] showWithData:[rld returnURLvalue]]; 

을 사용 (물론 시간 파일에서 적절한 선언)

-(NSURL*)returnURLvalue {return URL;} 

.

나는 이것이 당신의 상황에서 효과가 있을지 모르겠다. 그러나 나는 종종 그 문제와 관련하여 설명 할 수없는 문제를 해결했다. 표기법. 그냥 생각.

+0

왜 이것이 rld.URL을 사용하는 것과 비교하여 차이가 나는지 설명 할 수 있습니까? – hennes

+0

안된다. 그러나 때로는 그렇지 않다. 그 이유에 대해서는 결코 좋은 대답을 찾지 못했습니다. 이 문제에 영향을 미칠지 모르겠지만 비슷한 문제는 해결됩니다. –

0

정말 많은 요소를 listDataArray에 저장하는 경우에는 편의 생성자 [NSURL URLWithString : ...]을 명시 적 메모리 할당으로 대체하고 이후의 할당을 해제하는 것이 좋습니다.

NSURL* URL = [[NSURL alloc] initWithString:...]; 
rld.URL = URL; 
[URL release]; 

편의 생성자의 라인을 따라 뭔가 자동 해제 객체 및 자동 해제 객체의 사용이 많은 개체가 생성되는 상황에서 권장하지 않습니다 반환합니다. this question에 대한 답변도 참조하십시오.

+0

당신은 왜 대부분의 시간 내 NSURL 괜찮아요에만 매우 가끔 그것은 비어있는 가설? – dubbeat

+0

@dubbeat 필자는 autoreleases 및 URL과 만 관련이 있다고 의심한다. 반면 제목은 복사되지만 URL은 유지된다. 어떤 시점에서 autorelease pool은 오버플로 될 것이고, 그 다음에는 어떤 것이 릴리즈되어야합니다. – hennes

1

은 임는이 시도하고 URL의이

listData *rld = [[listData alloc] init];

은 또한 당신의 인스턴스 변수를 모자 해달라고 소멸하지 않을 수 있습니다 모든

listData *rld = [listData alloc];

에서 작동 놀라게했다. 합성 지시문에서 가끔 혼란스러워합니다.

@interface ListData : NSObject { 
    NSURL *url; 
    NSString *title; 

} 

@property(nonatomic,retain) NSURL *url; 
@property(nonatomic,copy) NSString *title; 

@end 
+0

"self.listView = [[ListView alloc] showWithData : rld.URL];" 유사한 이유로 비린 해 보인다. showWithData :가 이니셜 라이저 인 경우에는 initWithData :라는 이름을 지정해야합니다. –

관련 문제