2013-12-23 3 views
0

제거 된 뷰에 할당 된 removeFromSuperview 메모리를 호출하면 내가 혼동 스럽습니다. 그래서 여기 내 코드와 테스트 결과의 일부입니다. uiscrollview에 추가 된 uiscrollview 및 uiview가 있습니다. 그래서 내 uiscrollview 스크롤 할 때 나는 removefromsuperview를 호출하고 그 메모리가 공개 될 것이라고 기대한다.removefromsuperview에서 메모리를 해제하지 않습니다.

-(void) someFunction { 
magazineContentView = [[MagazineContentView alloc] initWithFrame:CGRectMake(35 + 320 *i ,0,self.view.frame.size.width,self.view.frame.size.height)]; 
[_scrollView addSubview:magazineContentView]; 
} 
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { 
[magazineContentView removeFromSuperview]; 
magazineContentView = nil; 
} 

magazineContentView가 올바르게 제거되었지만 메모리가 줄어들지 않습니다.

저는 ARC를 사용하지 않습니다.

감사합니다.

+0

ARC를 사용하고 있습니까? 기억이 줄어들지 않았 음을 어디에서 확인하고 있습니까? 악기? 귀하의 질문에 모든 관련 세부 사항을 포함하십시오. – Sid

+0

재생에 대한 감사, 아니요 ARC를 사용하지 마십시오. 표준 xcode 메모리 보고서를 사용하고 있습니다. 할당하기 전에 메모리 크기를 볼 수 있고, uiview를 추가하는 것은 8.5MB의 화면을 추가 한 후 9MB가되지만 uiscrollview에서이 뷰를 제거한 후에도 여전히 9MB를 유지합니다. 죄송합니다. 현재이 권한이없는 스크린을 첨부 할 수 없습니다. – Sergo

답변

1

magazineContentView를 할당하고 하위보기로 추가하면 두 번 유지됩니다. ARC를 사용하지 않고 Manual Retain Release를 사용하고 있기 때문에 하위보기로 추가 한 후 어느 시점에서 해제해야합니다.

[magazineContentView removeFromSuperview]은 보유 수를 1 줄입니다. init 호출로 인해 하나의 유지 된 인스턴스가 여전히 있습니다.

(참고하시기 바랍니다. 실제로 카운트를 유지하는 것에 대해 신경 쓸 필요는 없지만 여기에서 내 대답을 더 잘 설명해 드리겠습니다.)

또한 당신이하는 것처럼 ivar을 직접 설정하는 것은 속성이 아니기 때문에 실제로 도움이되지 않습니다.

또한 didEndDecelerating 호출에서 수퍼 뷰를 제거하지 않아야합니다. 이것은 나쁜 습관입니다. 이것을 0으로 설정했기 때문에 removeFromSuperview을 호출해도 아무런 해가되지는 않지만 좋은 코드 설계는 아닙니다.

왜 ARC를 사용하지 않는가? 사용하는 것이 훨씬 깔끔합니다.

MRR 사용을 주장하는 경우, 하위보기로 추가 한 후 magazineContentView에서 release를 호출해야합니다. 이렇게하면 나중에 removeFromSuperview를 호출 할 때 보유 및 릴리스가 균형을 이룹니다.

-(void) someFunction { 
magazineContentView = [[MagazineContentView alloc] initWithFrame:CGRectMake(35 + 320 *i ,0,self.view.frame.size.width,self.view.frame.size.height)]; 
[_scrollView addSubview:magazineContentView]; 
[magazineContentView release]; 
} 
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { 
// Move these to some other place... e.g. a separate method that does this only once 
[magazineContentView removeFromSuperview]; 
magazineContentView = nil; 
} 

또한, 먼저 누출에 가까운주의를 지불해야합니다, 당신은 할당 측정 봐야한다.

Apple의 메모리 관리 지침을 보았습니까? 이 문서를 읽고 MRR을 조금 더 잘 이해할 수있는 시간을 할애하여 투자 할 가치가 있습니다. - https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html

관련 문제