2012-12-10 3 views
0

메모리 관리 문제를 검색하려고 많은 심의와 약간의 좌절감을 느낀 후에 일부 연구를 수행 한 후 마침내 ARC로 변경하는 데 굴복했습니다. 그리고 그것은 비교적 고통 스러웠습니다. 그러나 새로운 문제는 내 UIViewControllers와 관련이 있었고 Pre-arc 그들은 모두 광고로 작동했습니다. 스택에 밀어 넣었습니다. 스택에 나타나서 dealloc 메서드가 호출되어 모두가 행복해졌습니다. ARC로 전환하면 절대 dealloc이 호출되지 않습니다. 그것은 불행한 일입니다. 그래서이 문제로 몇 가지 조사를했는데, 제가하고 및/또는 .firstly UIViewController 및 ARC

을하고 있지 않다 무엇인지 목록을 보자, 내가 스택에 밀어 오전보기는 명시 적으로 강력한 선언하지 않습니다.

하위 클래스는 상위 클래스의 보유 국지적 대리인 unsafe_unretained이지만 염기를 덮는 심지어 부모, 기쁨에 위임 설정 주석.

오프 .Turned NSzombies은 분명히 그이

if (_friendsListVC == nil) 
{ 
    _friendsListVC = [[FriendsListViewController alloc] initWithNibName:nil bundle:nil]; 
    _friendsListVC.delegate = self; 
} 

[self.navigationController pushViewController:_friendsListVC animated:YES]; 

(_friendsListVC에서, Memory not released in ios view hierarchy에 대답 브래드은 두가지를 따라, ARC에 곁에 물건을 일으킬 코드

내 코드를 변경 .I

가능합니다 멤버 변수입니다. 다시이

FriendsListViewController *fVC = [[FriendsListViewController alloc] initWithNibName:nil bundle:nil]; 
//fVC.delegate = self; 
[self.navigationController pushViewController:fVC animated:YES]; 

기쁨에, 사람의 상단에서의 dealloc 중단 점 적중 결코 극복하고, 일이 내가 밀어 내 응용 프로그램에서 의견을 많이 팝업, 그래서 이것은 단지 더 많은 메모리 문제가 발생할 것입니다 나는 희망에 따라 수정하기 위해 ARC로 바꿨다 ...

또한이보기에는 몇 가지 코드 블록이 있지만 다른 것들도있다. 그러나 내가 읽는 자기도 사용하지 않는다. 약한 심판은 코드 블록에 관해서입니다.

나는 엉망이되어, 누가 ARC가하고 있는지에 관해 나를 설명 할 수 있습니까? 또는 ARC를 사용하는 것에 대해 내가 싫어하는 것은 무엇입니까? 나중에 ARC의 뷰 계층 구조로 밀어 넣기를 원하는 모든 뷰는 인스턴스 변수가 아니어야합니까?

미리 감사드립니다.

+0

당신은 nszobie를 사용할 수 있습니까? –

답변

3

나는 문제가 무엇인지 알아 냈하지만 dealloc'ed되지 않은 다른 컨트롤러가 해결되지 않았다 전적으로.그래서 대부분 ARC 및 UIViewControllers 코드 블록에 관한 지식을 확산 가능성이 사이클을 유지하게됩니다 내가 사물의 번호를 나열하기 위하여려고하고이 고통을 다른 사람을 완화의 관심

  1. 하지 마십시오 당신이 추진하고있는 견해에 대한 강한 언급을 가지고있다.

  2. 뷰 계층을 푸시하는 클래스에 push 메서드를 호출하는 클래스의 대리자가있는 경우 unsafe_unretained 참조로 설정하면 실제로 모든 대리자를 내 대리자 중 하나로 unsafe_unretained로 설정하는 것이 좋습니다. 강한 ARC 변환기가 나를 위해 그것을 할 것이라고 생각했습니다.

  3. 는 NSZombies을 끕니다

    . dealloc 문이 필요할 때 호출되는지 확인해야 할 때만 영구적으로 신경 쓰지 마세요.

  4. 이는 사이클을 유지하는 원인 코드 블록에서 자기를 직접 참조하지 마십시오. 자기를 사용해야 할 경우, 블록 외부에서 다음을 수행하십시오 (그리고 weakself를 사용하십시오).

    __unretained_unsafe className * weakSelf = self;

  5. 이것에 대해 확실하지 오전, 정적 참조 조심하지만 난 두 개의 인스턴스 뷰 컨트롤러에 가져다가 다른 위에 하나를 밀어하는 방법을 가지고, 참조는 내 그들 중 두 개의 정적 인스턴스에 할당 된 이 클래스 (왜 묻지 마세요), 사용 후 제로화 한 후 내 문제를 해결 한 것처럼 보입니다. 왜 그런지 모르겠습니다.

  6. 이것은 내가 알지 못하지만 한 번 또는 두 번 어딘가에서 언급 한 것을 보았습니다. 클래스에 코드 블록이 있으면 해당 블록 내에서 인스턴스 변수를 사용하지 말고 다시 __unsafe_unretained 변수를 만듭니다.

그리고 그 모든 내 의견을 이들의 대부분을 확인하고이를 수정 한 후, 그것에 대해의 모든 시간이 아니라 몇 가지 이상한 임의의 점에서 밀어 때 자신의 dealloc 메서드가 호출합니다. 또한 이것은 똑같은 문제에 직면 해있는 사람들을 빠르게 도울 수있는 간략한 체크리스트 일 뿐이라는 것을 분명히하기 위해 여기에 몇 가지 개념을 완전히 이해한다고 주장하지는 않지만 시간이되기를 희망합니다.

0

이것은 악기가 존재하는 이유입니다. Leaks 도구를 실행하면 알 수있는 뷰 컨트롤러와 내가 갖고있는 뷰 컨트롤러 (무엇을 알지 못함)를 할당하는지 알려줄 것입니다.

또한, 메모리 누수가 존재한다고 주장하지만 당신은 당신이 ObjectAlloc 악기를 실행하고 표시 될 때까지 메모리 사용이 실제로 반복 사용에 오르는 것을 모른다.

+0

나는 누출 테스트를 실행했는데, 그래서 나는 당황하여 dealloc가 호출되지 않았더라도 누수가 나타나지 않았다. 나는 ARC에 대해 아직 상당히 익숙하지 않은 점을 상세히 설명해야만하고, ARC를 가짐으로써 누출 도구가 쓸모 없게되거나 다른 기괴한 행동을하게 될지 확신 할 수 없었습니다. 그러나 만약 내가보기를 누른 다음 팝업, 아니 dealloc,하지만 내가 동일한보기를 누른 다음 두 번째 팝업, 비올라, 우리 dealloc, 이상한 사업, 그리고 누수가 없어 그래서 내가 행복해야한다고 생각. – Genhain

+0

ARC와의 작업을 위해 누수가 발생합니다. 그러나 당신이 가진 것은 아마도 누수가 아닙니다. 뭔가 다른 VC를 유지하고 있습니다. VC의 두 번째 인스턴스가 만들어지면 마침내 출시되는 것을 볼 수 있습니다. 이전에 유지 한 것이 무엇이든 새로 보유하고 있기 때문입니다. Object Alloc과 heapshot을 사용하여 예기치 않게 VC를 유지하려고하는 것을 시도합니다. –

0

같은 문제가 있습니다. 내 프로젝트에서 NSZombie 옵션을 사용할

, 그것은 나를 위해 일했습니다. 나는 왜 그런 일이 일어나는지 모른다. 사람들은 여러 가지 이유가 있었다 ProductEdit 계획에

  • 이동
  • 비활성화 NSZombie
+0

위에서 켄달에게 지적했듯이, dealloc 메서드가 호출되기에 좋은 시간이라고 결정하기 전에 컨트롤러를 한 번 이상 푸시해야합니다. 입력에 감사드립니다. – Genhain