0

내 스레드를 잠시 실행 한 후에 Instruments는 __NSDate가 지속적으로 # 살아있는 값을 받음을 보여줍니다.스레드의 iOS 메모리 누수

내 결론은이 트레드가 객체를 배제하지 않는다는 것입니다. 그러나이 줄은 컴파일 오류를 발생시킵니다. NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

이 스레드가 모든 객체를 유지하도록하려면 어떻게해야합니까? 아니면 어떻게 ARC가 작동하는 적절한 스레드를 만들어야합니까?

- (void) start { 
    NSThread* myThread = [[NSThread alloc] initWithTarget:self 
              selector:@selector(myThreadMainRoutine) 
              object:nil]; 
    [myThread start]; // Actually create the thread 
} 

- (void)myThreadMainRoutine { 

    // stuff inits here ... 


    // Do thread work here. 
    while (_live) { 

     // do some stuff ... 

     [runLoop runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.05]];   
     [NSThread sleepForTimeInterval:0.05f]; 
    } 

    // clean stuff here ... 

} 

답변

5

오토 릴리즈 객체는 아마도 증가 메모리 사용, 이유하지만 당신은 ARC와 NSAutoreleasePool을 사용할 수 없습니다.

@autoreleasepool { 
    // ... 
} 

업데이트와

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
// ... 
[pool drain]; 

교체 : 당신은 실제로 귀하의 경우 두 개의 오토 릴리즈 풀을해야합니다. Threading Programming Guide 상태, 첫째 :

응용 프로그램이 당신이 당신의 스레드 항목 일상에서 할 첫 번째 일은해야 오토 릴리즈 풀을 생성, 관리되는 메모리 모델을 사용하는 경우. 마찬가지로이 자동 해제 풀을 삭제하면 스레드에서 마지막으로 수행 한 작업이 이어야합니다. 이 풀은 자동 채움 된 개체가 잡히지 만 스레드 이 종료 될 때까지 해제하지는 않습니다. 장기 실행 루프에서 만든 그렇지 않으면 모든 오토 릴리즈 객체에만 스레드 종료를 발표 할 것 :

그리고 마지막 문장은 다른 오토 릴리즈 풀을 필요로하는 이유 단서를 제공합니다. 그래서 당신은 내가 전에 내부 루프 반면, 어떤 코드에 대해 그것을 넣고이 후, 내 while 루프 내부의 전체 기능과 두 번째 autoreleasepool 하나 개 autoreleasepool 블록을 가져야한다,

- (void)myThreadMainRoutine { 
    @autoreleasepool { 
     // stuff inits here ... 
     while (_live) { 
      @autoreleasepool { 
       // do some stuff ... 
       [runLoop runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.05]];   
       [NSThread sleepForTimeInterval:0.05f]; 
      } 
     } 
     // clean stuff here ... 
    } 
} 
+0

감사가? – michael

+1

@michael : 나의 마지막 코멘트는 실제로 잘못되었습니다. 두 개의 수영장이 필요합니다. 그에 따라 대답을 업데이트했습니다. –

0
- (void)myThreadMainRoutine { 
    @autoreleasepool { 
     // stuff inits here ... 

     // Do thread work here. 
     while (_live) { 
      // do some stuff ... 
      [runLoop runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.05]];   
      [NSThread sleepForTimeInterval:0.05f]; 
     } 

     // clean stuff here ... 

    } 
} 
+0

하지만 루프 동안 NSDate 개체를 정리하지 못했습니다. 메서드가 완료된 후에야 루프 안에 넣어야했습니다. 괜찮습니까? – michael

+0

두 개 이상의 자동 해제 풀을 가질 수 있으며 가능한 한 빨리 임시 객체를 해제하려는 위치에서 자동 풀 풀을 사용할 수 있습니다. 커스텀 쓰레드에서는 전체 쓰레드를위한 풀이 하나 이상 필요합니다. – simalone