2014-01-09 3 views
1

ARC가 활성화되고 iOS 7에서만 응용 프로그램이 생성됩니다. 내 모든 속성은 적절하게 약한 것으로 표시되고 모든 강력한 변수는 필요한 곳에 nil로 표시됩니다.ARC가있는 경우에도 계측에서 메모리가 계속 증가합니다.

Instruments에서 응용 프로그램을 실행할 때 메모리 할당이 지속적으로 증가하는 것으로 나타났습니다. 어떤 화면으로 가면 메모리가 증가합니다 (대략 2MB). 내가보기를 터트 리면 메모리는 몇 KB 밖에되지 않습니다. 나는 무슨 일이 일어나는 지 모른다.

나는 다음을 사용하고 뷰를 저런 애 동안 :

UPDATE : 여기

[UIView animateWithDuration:0.5 animations:^{ 
     CGRect newFrame = aSideMenu.view.frame; 
     newFrame.origin = SIDE_MENU_VIEW_ORIGIN_FINAL; 
     [aSideMenu.view setFrame:newFrame]; 
    } completion:^(BOOL finished) { 
     [sender setUserInteractionEnabled:YES]; 
}]; 

내가 블록에 aSideMenu을 사용하고 있습니다. aSideMenu은 강력한 변수입니다. 약한 참조 및 사용법을 만들어야한다고 생각합니까?

__weak id aWeak = aSideMenu; 

이 aWeak 대신 aSideMenu를 사용 하시겠습니까? 또한

몇 블록에서 내가 사용하고 있습니다 :

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:....nil]; 

내가 너무 '딕셔너리'의 약한 참조를 전달해야 하는가?

이유가 확실하지 않습니다. 문제를 추적하도록 도와주세요. 또한 더 나은 해결책을 위해이 질문에 추가해야 할 것이 있으면 알려주십시오.

감사합니다.

+0

이 블록 안에있는 사진을 표시 할 수 있습니까? 그것은 당신이 어떤 객체를 보유해서는 안되며 참조하는 것이 가능합니다 ... 만일 당신이 블록에서 자기에 접근하고 있다면 블록에 들어가기 전에 자기 자신에 대한 약한 포인터를 생성하십시오. –

+0

예, 사이드 블록의 강한 포인터에 대해서는 약한 참조를 만들어야합니다. 그러나 객체가 할당 해제 된 경우 weak 포인터는 nil이 될 수 있으므로 블록 내부의 약 포인터를 강력하게 참조하고 사용하기 전에 nil을 확인하십시오. 사전의 경우 해당 인스턴스 변수 또는 속성이 예인 경우 메서드 로컬에서 블록 연산자를 사용하고 해당 블록이 측면 블록이면 그대로 사용합니다. –

답변

1

코드를 붙여도 좋을 것입니다. 코드가 없으면 몇 가지 팁을 줄 수 있습니다. 블록에서 자기 자신의 강력한 포인터에 액세스하려고하지 마십시오. 블록에 들어가기 전에 자기의 약한 포인터를 만듭니다.

__weak id weakSelf = self; 

그런 다음 블록 내부에 weakSelf을 사용하십시오.

또한 할당 된 메모리가 절충 될 기회가없는 무한한 메모리 증가를 테스트하고, 할당 계기를 사용하여 발자국을 차지할 수 있습니다.

는 업데이트 : 당신이 강력한 포인터에 setter 메소드를 호출하기 때문에

  1. YES, 그것은 그것을 유지합니다. 공유하는 경우 __weak 또는 __block으로 설정해야합니다. https://developer.apple.com/library/ios/documentation/cocoa/conceptual/Blocks/Articles/bxVariables.html#//apple_ref/doc/uid/TP40007502-CH6-SW1

  2. 더 많은 코드를 작성한 후, 블록에서 참조에 대해 좀 더 명확하게하고 싶습니다. 블록 내부에서 강력한 포인터를 참조 할 때 메모리 문제가 발생할 수 있습니다. 유효한 참조가 있기 때문에 블록에서 할당 취소를 허용하지 않기 때문에 메모리 문제의 주요 원인이됩니다. 이를 위해 __weak id을 사용하여 약한 포인터를 만들었으므로 retian주기를 만들지 않습니다. 그러나 오브젝트에 다른 vaild 참조가 없으면 오브젝트가 할당 해제되고 weak 참조가 0이되어 충돌이 발생할 수있는 또 다른 문제점이 있습니다.

약한쪽에 강한 참조를 작성하고 해당 없음을 확인하는 것이 좋습니다.

+0

답변에이를 추가 할 수 있습니다. 블록을 사용할 때 강력한 참조주기를 피하는 방법을 자세히 설명합니다. 비록 당신의 대답이 그것을 잘 다루지 만. https://developer.apple.com/library/ios/documentation/cocoa/conceptual/ProgrammingWithObjectiveC/WorkingwithBlocks/WorkingwithBlocks.html – Freddy

+0

추가 ... –

+0

@ C_X 답장을 보내 주셔서 감사합니다. 업데이트 된 질문을 확인하십시오 .. –

관련 문제