2009-09-09 3 views
3

아래 라인이 메모리 누수가되는 이유는 무엇입니까? cellForRowAtIndexPath 메소드 내 왜이 라인에 메모리 누수가 있습니까?

cell.imageView.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:person.imageURL]]; 

: 여기

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"PersonCell"]; 

    if (cell == nil){ 
     cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"PersonCell"] autorelease]; 
    } 
    Person *person = [[Person alloc] initWithUserName:[people objectAtIndex:indexPath.row]]; 

    cell.imageView.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:person.imageURL]]; 

    cell.textLabel.text = [people objectAtIndex:indexPath.row]; 

    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 

    [person release]; 

    return cell; 
} 

그리고는 person.m에서 관련 방법이다

- (NSURL*) imageURL 
{ 
    return [NSURL URLWithString:[userInfo valueForKey:@"profile_image_url"]]; 
} 

편집 : 추가 초기화 방법 만

- (id)initWithUserName:(NSString *)user{ 

    userName = [user copy]; 
    userInfo = [[TwitterHelper fetchInfoForUsername:userName] retain]; 
    updates = [[TwitterHelper fetchTimelineForUsername:userName] retain]; 

    return self; 
} 
+0

누출이 있다는 것을 어떻게 압니까? –

+0

제이슨이 말했듯이; 어떻게 유출되었다고 판단 했습니까? 어떤 도구를 사용 했습니까? – bbum

+0

저는 장비에서 누출을 감시하고 있습니다. 그것이 도구가보고하는 것입니다. – Jason

답변

2

내가 그녀를 생각할 수있는 것 e가 누출의 원인이 될 수 있다는 것은 사용자 클래스에 imageURL을 보유하고 dealloc 메소드에서 해제하지 않았기 때문입니다. 따라서 사람을 공개 할 때 imageURL 속성이 누출됩니다.

+0

내 person.h에 @property (읽기 전용)가 포함되어 있습니다. NSURL * imageURL; – Jason

+0

그리고 imageURL은 – Jason

+0

으로 합성되어 있습니다. 저는 dealloc에 ​​[imageURL release]를 포함해야한다고 생각합니다. – Daniel

1

줄을 나누어 다시 테스트 해보십시오. 그것은 당신에게 약간의 통찰력을 줄 것입니다.

NSURL *imgURL = person.imageURL; 
NSData *imgData = [NSData dataWithContentsOfURL:imgURL] 
cell.imageView.image = [UIImage imageWithData: imgData]; 

그리고 첫 번째 것이 누출을 일으키는 지 확인할 수 있습니다.

누수가 얼마나되는지 압니까? 이미지 크기 또는 URL 크기입니까?

+0

누수가 32 바이트이고 나눌 때 인스트루먼트에 알려준다. 그 NSData * imgData = [NSData dataWithContentsOfURL : imgURL] 누설의 소스입니다. – Jason

+0

32 바이트가 짧은 URL 문자열에 적합한 크기라고 생각합니다. 어쩌면 person.imageURL이 유지되고 있으며 자동 응답을하지 않을 수도 있습니다 ... [imgURL retainCount]를 확인하십시오. – mahboudz

+0

NSURL * imgURL = 사람.imageURL; \t NSLog (@ "보유 개수 : % i", [imgURL retainCount]); \t NSData * imgData = [NSData dataWithContentsOfURL : imgURL]; \t NSLog (@ "보유 개수 : % i", [imgURL retainCount]); 출력은 1이고 그 다음 9입니다. – Jason

1

UIImage는 많은 캐싱을 수행합니다. UIImage가 이미지의 캐시를 가지고 있으면 누수가 발생할 수 있습니다.

1

Person에 대한 dealloc이 있습니까?

userName = [user copy]; 
userInfo = [[TwitterHelper fetchInfoForUsername:userName] retain]; 
updates = [[TwitterHelper fetchTimelineForUsername:userName] retain]; 
0

이는 autoreleasing 관련이있을 수 있습니다 : 당신의 dealloc에 ​​다음 방출하지 않는 경우

은 물론이 세 가지 라인은 누출 있습니다.

코코아의 [NSData dataWithContentsOfURL:...]과 같은 생성자는 자동으로 자동으로 리사이징됩니다. 이 전화는 [[[NSData alloc] initWithContentsOfURL:...] autorelease]과 같습니다. 이것은 이것과 관련이있을 수 있습니다.

관련 문제