2013-02-15 1 views
0

Objective-C에 퍼즐 풀이를 작성했습니다. 폭 넓은 첫 번째 검색을 사용하여 초기 퍼즐 상태에서 도달 할 수있는 상태를 탐색합니다. 검색은 첫 번째 우승 상태에 도달하면 종료됩니다. 유일한 최적화는 이미 본 상태에서 다시 탐색하지 못하게하는 참조 테이블입니다.Objective-C의 BFS에 대한 메모리 고려 사항

알고리즘이 올바르게 작동하는 것 같습니다. 그러나 프로파일 링은 많은 메모리를 사용하고 있다는 것을 보여 주며 이유를 이해하고 싶습니다. 내 이해의 차이는 Objective-C 실행 루프 및 자동 릴리스 풀과 관련이 있다고 생각합니다.

다음 (단순화 된) 코드가 실행 루프에서 반복을 완료하고 자동 해제 풀을 배제 할 수 있습니까?

- (void) search { 
    while (![myQueue empty]) { 
     State *state = [myQueue pop]; 
     for (State *s in [state allReachableStates]) { 
      [myQueue push:s]; 
     } 
    } 
} 

NSArrays 프로파일 링에 사용되는 많은 양의 메모리를 나타낸다. allReachableStates은 상당한 수의 배열을 생성하므로 의미가 있습니다. 그들은 모두 autoreleased이기 때문에 위의 코드가 autorelease 풀이 빠지는 것을 막을 가능성이 있습니다.

모든 코드는 주 스레드에서 실행되며 ARC를 사용하지 않습니다.

편집 : 그래서 for 루프를 @autoreleasepool에 배치했습니다.

답변

3

이 런 루프와 관련된 자동 해제 풀이이 방법에서 고갈되지 않는다는 것이 맞습니다. 이 메서드가 반환 된 후 얼마 지나지 않아야 비워집니다.

당신은 @autoreleasepool 자신 (각 상태에 대해 하나)

+0

'@ autoreleasepool'에서 while 루프의 일부를 감싸는 것이 트릭을 만들었습니다. 감사! – SundayMonday