나는 개발중인 응용 프로그램을 가지고 있으며 Xcode가 거의 모든 것을 만들어 내고있는 것으로 보입니다 (왜 그런 것 같습니까?)라고 이해하는 데 어려움을 겪고 있습니다.이상한 ARC 메모리 릴리스 문제
지금까지 모든 의견과 정보 등을 매우 간단하게 제시하고 있습니다. 나는 2 ViewController
을 가지고 있는데, 하나는 실행시에 나타나고, 다른 하나는 로그인이 성공한 것으로 간주됩니다.
나머지 정보는 내가 만든 여러 하위 클래스 (대부분 하위 클래스가 UIView
, UILabel
또는 UIButton
)로 처리됩니다.
매우 자주 사용하는 클래스 중 하나는 MenuView
입니다. 이것은 문자 그대로 메뉴를 만드는 클래스입니다.
- (MenuView *)createMenuWithFrame:<FRAME> size:<SIZE> type:<TYPE> view:<VIEW>{
MenuView *menu = [MenuView alloc] initWithFrame:<FRAME>];
/// Code for creating a UIView with a background image for a menu.
...
/// Done. Now the menu gets added to the passed view <VIEW>.
return menu;
}
내 문제는 사실상 지금 (도시) 계층 구조에 추가 될 때마다 뷰가 MenuView
, 또는 메뉴를 사용하기 때문에, 내가 제시 각보기에 걸쳐 지속 될 것으로 보인다.
예
것은 나는 서브 클래스를 초기화하는 호출로, 아주 간단하게 의견을 제시하고있다.
예를 들어 내 설정보기 하위 클래스 SettingsView
을 살펴 보겠습니다.
HomeViewController.m,보기 컨트롤러 # 2.
#pragma mark Settings
- (IBAction)openSettings:(id)sender {
[SettingsView createSettingsViewForView:self.view];
}
SettingsView.m. 참고 : 내 MenuView.m 클래스 내가 만들었던 메뉴를 UIView
에 전달합니다. 제대로 처리하는 경우 (사용 된 메모리에서 제거)
#import "SettingsView.h"
UIView *screenView;
@implementation SettingsView // a UIView subclass type in interface (.h)
#pragma mark - Create View
+ (void)createSettingsViewForView:(UIView *)view {
// Here I create a MenuView. This method is just a wrapper of
// the menu class. It doesn't create a SettingsView, but rather
// creates another MenuView *menu.
// The menu is given some content, then "shown" (alpha 0 -> 1)
// through the MenuView class by using [menu animateMenu:menu];
}
내가 자주 이미지를 사용하여 메모리 할당의 측면에서 "비용"이 될 것이라는 점을 이해하지만, 나는 아직 발표한다 매우 확신합니다. 내 경우에는, 내가 어떤MenuView
항목을 폐쇄하면 ...
을 올바르게 처리, 아직도 그렇게 생각했다 생각, 내가보기 (알파)에서 메뉴를 애니메이션, 다음 애니메이션 완료시, 나는 제거 메뉴를 선택합니다.
내가 설정을 제시
- (void)closeMenuView:(UIButton *)closeButton {
MenuView *menu = (MenuView *)closeButton.superview;
[UIView animateWithDuration:0.1 delay:0 options:UIViewAnimationOptionCurveEaseOut | UIViewAnimationOptionAllowUserInteraction animations:^{
<CUSTOM TRANSITION OUT OF VIEW>
} completion:^(BOOL finished) {
[menu removeFromSuperview];
}];
}
문제가 HomeViewController.m에서 볼 수, (이미 내가 좋아하는 것보다 더 높은) 내 기억이 ~ 10메가바이트스파이크. 화면 크기/해상도에 따라 이미지 크기를 최적화하면 메모리 사용량이 크게 줄어들지 만 내가 가지고있는 문제는 중요하지 않습니다.그냥 98메가바이트에 88메가바이트을 가정 해 봅시다에서 ~ 10메가바이트 일단 메뉴를 닫아 엑스 코드의 눈에 아무런 영향을 미치지 않습니다, 추가됩니다.
악기를 사용하여, 나는 사실 낮은 영구 메모리가 있어야한다 무엇도 인 사용 것입니다 다음 메뉴를 닫은 후, 메뉴를 열고 찾을 (~ 11메가바이트 설정을 열었다 + 1.5 메가바이트
보기를 제거하는 나의 방법을 의심하게 만드는 다른 불안한 문제는 큰 (더 복잡한) 메뉴를 제시하고 제거 할 때 하나는 MailView
이고,보기가 "열릴 때마다"메모리가 올라갈 것입니다. 그러나 메모리는 절대로 출시되지 않으므로 인스트루먼츠는 메모리 누수가 없다고하지만 명확하게이 메모리를 유지하는 문제가 있음을 알립니다.
다음은 악기를 통한 녹음의 스크린 샷입니다. 이는 'Details -> Statistics -> Allocation Summary ("Mail"로 검색) -> MailView에서 추적됩니다.
내 애플을 파괴하지 않고 MailView의를 만들기 위해 계속 어떤 이유 보인다.
질문
내 질문은, (나와 함께 머물 감사) 내 메모리 사용의 독서 엑스 코드 및/또는 인스트루먼트 버그이 있나요? 또는 이것은 응용 프로그램의 내부 문제입니다. 가장 좋은 대답을 얻기 위해 제공해야 할 것이 더 많지만, 내가 본 것부터 설명하면 각 뷰는 뷰 계층 구조에 추가 된 UIView 일뿐입니다. 그런 다음 제거됩니다 (이후에 " subviews 아래에보기에서 체인).
여기에 많은 게시물이 있으므로 이와 비슷한 문제에 대해 많은 사람들이 (ARC를 사용하고 있지만 removeFromSuperview, = nil (필자가 시도한), Instruments, 수동으로 dealloc 사용) 제안합니다.
내가 누락 된 내용이나 전혀 알지 못하는 내용이 있으면 알려 주시면 감사하겠습니다. 감사합니다
은 참고
나는 아이폰 OS 장치 B)는 A)는 (더 이상 아웃 타이밍에서 가장 가능성이 필요하지 않은 생각하지 않는 한 기본적으로는 할 수있는 모든 일에 개최하는 것) 또는 이해 기억력이있어 "가장 중요하지 않은"항목을 제거합니다. 그러나 다시 한번 말하지만, 나는이 사건들에 대한 기억의 경고를 받고 있기 때문에 그렇지 않다.
UPDATE :
(난 그냥 업데이트 한 8.2.1에 오늘은 그래서 차라리 통과하는 것보다 엑스 코드에서 DMG를 통해 지금) 제도 활성화의 malloc과의 역 추적을 (볼 수 있었다 기기)
을 보유하고있는 항목 중 하나를 선택하면 다음과 같은 구조가 절단됩니다. 이것은 메일을 2 번 닫고 열어 두 번째보기가 유지 된 후입니다. 이것이 내가 고쳐야 할 것입니다.여기
다른 실행의 메모리의 그래프의 한조각 열고 메일보기 여러번 폐쇄 데있다.
MailView
이고,보기가 "열릴 때마다"메모리가 올라갈 것입니다. 그러나 메모리는 절대로 출시되지 않으므로 인스트루먼츠는 메모리 누수가 없다고하지만 명확하게이 메모리를 유지하는 문제가 있음을 알립니다.
주 대기열에 removeFromSuperview를 넣으려고 한 적이 있습니까? 그 스레드가 백그라운드 스레드에서 제거된다고 가정하고 있습니까? 아마도 dispatch_async (dispatch_get_main_queue(),^{// removeFromSuperView})를 시도하십시오; – Joshua
다른 시도해주세요 –
Xcode의 디버그 메모리 읽기를 통해 일어나는 일은 처음 메모리 점프가 약 7MB이고 "닫힌"상태가 2.2로 내려 갔을 때 각각이 닫히면 +0.3MB가 닫히고 서서히 증가합니다 사용 된 메모리를 늘리는 것. 아니 내가 여기에 실종 됐어 아무 단서도 ... –