2010-06-28 1 views
6

업데이트 :이 누수가 해결되었습니다. 비슷한 누수가 발생하고 응용 프로그램이 멀티 스레딩 인 경우 배경 스레드에서 UIKit 호출을 할 가능성이 큽니다. 예를 들면 [NSThread performSelectorOnMainThread:]은 UIKit 호출을 주 스레드로 호출합니다.이 스레드는이며 허용되는 유일한 위치는입니다.자동 누락 된 개체에서 누수 (장비)가 누출을보고합니다.

저는 현재 누수를 찾기 위해 현재 프로젝트에서 누수를 실행 해 왔으며, 나는 누설이 아니라는 것을 알 수있는 "누출"을 계속 실행합니다. 프로젝트에서 직접 촬영 한 다음 코드는, 누출에 따르면,이 누수가 있습니다 (업데이트 2-3 참조)

:

- (NSArray *)areaForIndex:(int)index 
{ 
    NSMutableArray *a = [NSMutableArray arrayWithArray: 
     [world retrieveNeighborsForIndex:index]]; // leak 1 
    [a insertObject:[references objectAtIndex:index] atIndex:0]; 
    return [NSArray arrayWithArray:a]; // leak 2 
} 

누출 (1) 내가에 첫 번째 줄을 변경하면 도망 간다 누출이 내가 마지막 행을 변경하면 도망 간다 :

return a; 

나는 불행하게도 누출 1 내가 변경 가능한 하나에 불변의 배열을 주조하고 있습니다 때문에 그렇게 할 수 없습니다. 그래도 arrayWithArray는 autorelease, 어쨌든, 내가 말할 수있는 것으로부터, 그것은 아무것도 누설해서는 안됩니다. 왜 이런 일이 일어나고 있는거야?

업데이트 :이 장치와 시뮬레이터에서 테스트했습니다. 누설은 양쪽 모두에 있습니다. 다음과 같이

누출에 대한 역사는 간다 :

# | Category | Event Type | Timestamp | RefCt | Address | Size | Responsible Library | Responsible Caller 
--+----------+-------------+ 
0 | CFArray | Malloc  | 00:09.598 |  1 | 0x474f6d0 | 48 | asynchro   | -[muddyGrid areaForIndex:] 
1 | CFArray | Autorelease | 00:09.598 |  | 0x474f6d0 | 0 | Foundation   | NSRecordAllocationEvent 
2 | CFArray | CFRetain | 00:09.598 |  2 | 0x474f7d0 | 0 | Foundation   | -[NSCFArray retain] 
3 | CFArray | CFRelease | 00:09.611 |  1 | 0x474f7d0 | 0 | Foundation   | NSPopAutoreleasePool 

을 나는 위에서 식별 할 수있는 일들이 오토 릴리즈 배열은 어떻게 든 유지되는 그러나, 시뮬레이터에 나는이 누출에 대한 몇 가지 추가 정보를 얻을 수 두 번 누른 다음 1에서 어떤 아이디어 나 왜하지만 ...

업데이트 2 & 3 수를 유지하지 떠나는 오토 릴리즈 :

NSMutableArray *a = [[[NSMutableArray alloc] initWithArray: 
     [world retrieveNeighborsForIndex:index]] autorelease]; 
: 나는에 누출 1 라인을 변경 시도

나는 이것이 누출을 제거했다고 생각했지만 궁극적으로 그렇지 않았다. 그래서 나는 여전히 손실에 처해있다.

+0

기기 또는 시뮬레이터에서 테스트 중이십니까? – rickharrison

+0

현재 장치에만 있습니다. 하지만 당신 말이 맞아요, 나는 그것을 테스트하고 시뮬레이터에서 어떻게 나오는지를보고 업데이트 할 것입니다. – Kalle

+0

Simulator에서 시도한 것을 포함하도록 위의 설명을 업데이트했습니다. 포인터 주셔서 감사! :) – Kalle

답변

2

내 코드와 함께 다른 문제를 해결하면서이 문제를 해결했습니다.

주로 코드에는 주 스레드 외부에서 UI 업데이트가 만들어진 곳이 많았습니다. 이러한 다른 무관 한 문제 중 하나는 위의 코드에서 메모리 누수가 발생 했음에 틀림 없습니다. 아무 코드도 수정하지 않았더라도 누수가 더 이상보고되지 않기 때문에 (나는 누수가 0입니다.)

0

무엇을 retrieveNeighborsForIndex가 반환합니까?

이 방법의 결과가 유지 될 가능성이 있습니까 (자동 프리 아 레스되지 않았습니까?)?

+0

이웃 객체가 많은 객체 (9-12)를 포함하는 NSMutableSet 인 [neighbors allObjects]가 반환됩니다. – Kalle

-1

arrayWithArray는 변경 가능한 배열에 저장 한 객체를 유지합니다. http://www.iphonedevsdk.com/forum/iphone-sdk-development/14285-nsmutablearray-arraywitharray-does-add-retain.html

나는 그것을 풀어 주거나 ​​더 안전하지만 autorelease 속성이 설정된 개체를 만드는 것이 좋습니다. 이웃 객체를 호출하여 색인을 생성하면 해당 객체가 자동으로 해제되고 nsmutable 배열이 dealloc 될 때 해제됩니다.

EDIT : 한 가지 팁 메모리 버그 추적시 추가 할 수있는 것은 좀비를 활성화하고 참조 횟수를 확인하는 것입니다. 귀하의 개체의. 그런 다음 어느 것이 출시되지 않고 추적을 쉽게해야하는지 결정할 수 있습니다. 이 링크는 좀비를 활성화하기 위해 xcode 프로젝트를 설정하는 방법을 보여줍니다 : cocoadev.com/index.pl?NSZombieEnabled

+0

하지만,'arrayWithArray :'에 의해 반환 된 배열 자체가 자동으로 릴리즈되므로, 직접 릴리즈하면 충돌이 발생할 수 있습니다. 즉, 변경 가능한 배열 자체를 반환하는 것은 안전합니다. 숨겨진 부작용없이 동일한 메서드로 반환하고 반환하기 때문입니다. – Wevah

+0

그건 누수 2 (그리고 내가 지금하고있는 일이야) 작동하지만, 누설 1, 내가 변경할 수있는 배열을 arrayWithArray를 사용하여 변경할 복용 후, 내가 그것을 반환하기 전에 추가해야하기 때문에 해결하지 않습니다 그것. – Kalle

+0

내 대답은 그런데 Wevah에 대한 것이 었습니다. 섀도우의'arrayWithArray :'는 배열의 객체를 유지하지만 그 자체는 포함되어 있지 않으며 해제되거나 자동 릴리즈되지 않아야합니다. – Kalle