수색…


간단한 스레드 만들기

스레드를 만드는 가장 간단한 방법은 "백그라운드에서"선택기를 호출하는 것입니다. 즉, 선택기를 실행하기 위해 새 스레드가 만들어집니다. 수신 객체는 self 뿐만 아니라 모든 객체가 될 수 있지만 주어진 선택자에 응답해야합니다.

- (void)createThread {
    [self performSelectorInBackground:@selector(threadMainWithOptionalArgument:)
                           withObject:someObject];
}

- (void)threadMainWithOptionalArgument:(id)argument {
    // To avoid memory leaks, the first thing a thread method needs to do is
    // create a new autorelease pool, either manually or via "@autoreleasepool".
    @autoreleasepool {
        // The thread code should be here.
    }
}

보다 복잡한 스레드 만들기

NSThread 의 하위 클래스를 사용하면 더 복잡한 스레드를 구현할 수 있습니다 (예를 들어, 더 많은 인수를 전달하거나 하나의 클래스에서 관련된 모든 도우미 메서드를 캡슐화 할 수 있음). 또한 NSThread 인스턴스는 속성 또는 변수에 저장 될 수 있으며 현재 상태 (계속 실행 중인지 여부)에 대해 쿼리 할 수 ​​있습니다.

NSThread 클래스는 cancelled 속성을 스레드로부터 안전한 방법으로 YES 로 설정하는 모든 스레드에서 호출 할 수있는 cancel 메서드를 지원합니다. 스레드 구현은 cancelled 속성을 쿼리 (및 / 또는 관찰)하고 main 메소드를 종료 할 수 있습니다. 이것은 작업자 스레드를 정상적으로 종료하는 데 사용할 수 있습니다.

// Create a new NSThread subclass
@interface MyThread : NSThread

// Add properties for values that need to be passed from the caller to the new
// thread. Caller must not modify these once the thread is started to avoid
// threading issues (or the properties must be made thread-safe using locks).
@property NSInteger someProperty;

@end

@implementation MyThread

- (void)main
{
    @autoreleasepool {
        // The main thread method goes here
        NSLog(@"New thread. Some property: %ld", (long)self.someProperty);
    }
}

@end


MyThread *thread = [[MyThread alloc] init];
thread.someProperty = 42;
[thread start];

스레드 로컬 저장소

모든 스레드는 현재 스레드에 대해 로컬 인 변경 가능한 사전에 대한 액세스 권한을가집니다. 이렇게하면 각 스레드가 고유 한 변경 가능 사전을 가지므로 잠금 없이도 정보를 쉽게 캐시 할 수 있습니다.

NSMutableDictionary *localStorage = [NSThread currentThread].threadDictionary;
localStorage[someKey] = someValue;

사전은 스레드가 종료 될 때 자동으로 해제됩니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow