2016-12-22 4 views
1

나는 개발중인 응용 프로그램을 가지고 있으며 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에서 추적됩니다.

enter image description here

내 애플을 파괴하지 않고 MailView의를 만들기 위해 계속 어떤 이유 보인다.


질문

내 질문은, (나와 함께 머물 감사) 내 메모리 사용의 독서 엑스 코드 및/또는 인스트루먼트 버그이 있나요? 또는 이것은 응용 프로그램의 내부 문제입니다. 가장 좋은 대답을 얻기 위해 제공해야 할 것이 더 많지만, 내가 본 것부터 설명하면 각 뷰는 뷰 계층 구조에 추가 된 UIView 일뿐입니다. 그런 다음 제거됩니다 (이후에 " subviews 아래에보기에서 체인).

여기에 많은 게시물이 있으므로 이와 비슷한 문제에 대해 많은 사람들이 (ARC를 사용하고 있지만 removeFromSuperview, = nil (필자가 시도한), Instruments, 수동으로 dealloc 사용) 제안합니다.

내가 누락 된 내용이나 전혀 알지 못하는 내용이 있으면 알려 주시면 감사하겠습니다. 감사합니다

은 참고

나는 아이폰 OS 장치 B)는 A)는 (더 이상 아웃 타이밍에서 가장 가능성이 필요하지 않은 생각하지 않는 한 기본적으로는 할 수있는 모든 일에 개최하는 것) 또는 이해 기억력이있어 "가장 중요하지 않은"항목을 제거합니다. 그러나 다시 한번 말하지만, 나는이 사건들에 대한 기억의 경고를 받고 있기 때문에 그렇지 않다.

UPDATE :

(난 그냥 업데이트 한 8.2.1에 오늘은 그래서 차라리 통과하는 것보다 엑스 코드에서 DMG를 통해 지금) 제도 활성화의 malloc과의 역 추적을 (볼 수 있었다 기기)

을 보유하고있는 항목 중 하나를 선택하면 다음과 같은 구조가 절단됩니다. 이것은 메일을 2 번 닫고 열어 두 번째보기가 유지 된 후입니다. 이것이 내가 고쳐야 할 것입니다.여기

enter image description here

다른 실행의 메모리의 그래프의 한조각 열고 메일보기 여러번 폐쇄 데있다.

enter image description here

+0

주 대기열에 removeFromSuperview를 넣으려고 한 적이 있습니까? 그 스레드가 백그라운드 스레드에서 제거된다고 가정하고 있습니까? 아마도 dispatch_async (dispatch_get_main_queue(),^{// removeFromSuperView})를 시도하십시오; – Joshua

+0

다른 시도해주세요 –

+0

Xcode의 디버그 메모리 읽기를 통해 일어나는 일은 처음 메모리 점프가 약 7MB이고 "닫힌"상태가 2.2로 내려 갔을 때 각각이 닫히면 +0.3MB가 닫히고 서서히 증가합니다 사용 된 메모리를 늘리는 것. 아니 내가 여기에 실종 됐어 아무 단서도 ... –

답변

1

음 .. "전망"사용자 정의 중 하나를 파괴 최선의 노력에도 불구하고, 그 가장 확실하게 계속이 "뷰"를 유지하는 객체를 파괴에 매우 효과가있을 것으로 보인다 실행 중에 응용 프로그램 VM 전체에 복제되고 복제됩니다.

특히, 원인은 NSArray이 아니었다. 생성 된 각 뷰에 대해 뷰 서브 뷰 (셀) 중 CUCells *cells의 간단한 배열이 생성되어 저장되었습니다. 처음에는 서브 클래스가 부모 클래스에 대한 강력한 참조가되도록 디자인했지만, "오픈"될 때마다 독립적으로 작성되도록 변경해야했습니다. 이 변경 작업을 수행하면 cells이 초기화되고보기가 열릴 때마다 할당되며 [cell removeFromSuperview]과 함께 파괴되지 않습니다.

  • cells = nil와 등 제대로 이전에 파괴보기에 모든 관계를 파괴하는 응용 프로그램에 허용 된 다른 "강력한"심판과 함께이 방법의 간단한 우선합니다.