업데이트 :이 누수가 해결되었습니다. 비슷한 누수가 발생하고 응용 프로그램이 멀티 스레딩 인 경우 배경 스레드에서 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 라인을 변경 시도
나는 이것이 누출을 제거했다고 생각했지만 궁극적으로 그렇지 않았다. 그래서 나는 여전히 손실에 처해있다.
기기 또는 시뮬레이터에서 테스트 중이십니까? – rickharrison
현재 장치에만 있습니다. 하지만 당신 말이 맞아요, 나는 그것을 테스트하고 시뮬레이터에서 어떻게 나오는지를보고 업데이트 할 것입니다. – Kalle
Simulator에서 시도한 것을 포함하도록 위의 설명을 업데이트했습니다. 포인터 주셔서 감사! :) – Kalle