2012-01-26 3 views
0

다른 사람의 코드를 작업하고 있습니다. 코드 라인을 발견했습니다.이 코드 조각에서 NSThread 사용

[NSThread detachNewThreadSelector:@selector(myMethod) toTarget:self withObject:nil]; 

질문이 두 개 있습니다.

  1. 그저 메소드를 호출합니다. 왜 NSThread가 여기에 사용됩니까?
  2. 코드를 실행하는 중 일부 인스턴스에서이 메서드가 호출되지 않습니다. 메서드 내에 중단 점을 넣으면 항상 호출됩니다. 그러나 중단 점을 제거하면 메서드가 호출되지 않는 경우가 있습니다. 이것이 NSThread의 문제입니까?

답변

3

이렇게 NSThread를 사용하면 "myMethod"메서드가 백그라운드 스레드에서 동시에 나머지 코드와 함께 호출되고 있음을 의미합니다. 그것은 당신이 또한 본 수있는이,하는 것과 같습니다 메서드가 호출 (또는 전화를받을 수 없습니다에 보이는) 점점되지

[self performSelectorInBackground:@selector(myMethod) withObject:nil]; 

경우 실행이 사실, 즉 동시성 문제에 다운되었을 수 있습니다 그 메쏘드의 순서와 주 스레드에서 호출 한 메쏘드의 순서는 보장되지 않으므로 실제로보다 일찍 호출 될 것으로 기대하고 있습니다.

당신이 말한다면 :

[NSThread detachNewThreadSelector:@selector(methodA) toTarget:self withObject:nil]; 
[self methodB]; 

그런 다음 methodA와 methodB 동시에에 을 실행하고 methodA는 methodB 전에 완료됩니다 보장은 없습니다.

2

내가 항상 같이 자동 해제 풀과 함께 NSThread detachNewThreadSelector를 사용

-(void)myMethod { 
     NSAutoReleasePool *pool = [[NSAutoReleasePool alloc] init]; 
     // .. Do stuff in this thread 
     [pool release]; 
    }; 

는 "단순히"선택기를 수행하려면, 다음과 같이 그것을 :

[self performSelector:@selector(myMethod)]; 
+0

요즘에는 @autoreleasepool {...}을 사용해야하지만 좋은 조언이기도합니다. –

+0

ARC'@ autoreleasepool' 블록을 사용하는 것이 좋습니다. 다른 방법이라도 괜찮습니다. http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSAutoreleasePool_Class/Reference /Reference.html. '@ autorelease' 블록은 (코드) 더 효율적입니다. – basvk

+0

@autoreleasepool 블록은 실제로 더 성능이 뛰어납니다. 추가 객체 생성과 여러 objective-C 메소드 호출을 제거합니다. 그들은 신택스 설탕처럼 보일 수도 있습니다. –

관련 문제