NSRunLoop 스레드 관리
무엇이 라인의 생존을 보장합니까?
스레드 불사(NSThread 인스턴스 객체가 제거되는 대신 스레드가 활성화되어 있음) 같은 스레드에서 여러 가지 작업을 수행할 수 있으며 원하는 대로 할 수 있습니다.
우리는 NSThread와 같은 종류로 라인 보존 문제를 토론한다.코드 보기:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor yellowColor];
self.thread = [[LSThread alloc] initWithTarget:self selector:@selector(start) object:nil];
[self.thread start];
}
- (void)start{
NSLog(@" 1 ...");
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
[self performSelector:@selector(doSth) onThread:self.thread withObject:nil waitUntilDone:NO];
}
- (void)doSth{
NSLog(@" 1 ...");
}
여기서 LSthread는 NSThread에서 상속됩니다.화면을 눌렀을 때 하위 라인에서self를 사용할 수 있습니다.thread에서 DoSth 방법을 실행하시겠습니까?코드를 통해 얻은 답은 안 된다.왜 그런 걸까요?서브라인이 start 방법을 실행한 후에 삭제되었기 때문에 이 서브라인에서 다른 방법을 실행할 수 없습니다.DoSth 방법이 실행되도록 하기 위해서, 우리는 이 서브라인을 활성화시켜야 한다.
NSRunLoop 비활성 스레드
코드를 수정하려면 다음과 같이 하십시오.
- (void)start{
NSLog(@" 1 ...");
NSLog(@" 1 ...");
NSLog(@" ");
[[NSRunLoop currentRunLoop] addPort:[[NSPort alloc] init] forMode:NSDefaultRunLoopMode];
[[NSRunLoop currentRunLoop] run];
NSLog(@" ");
}
하나의 라인은 하나의 RunLoop에 대응한다. 우리는 하위 라인의 RunLoop에 소스 1, 즉 NSPort 대상을 추가하고 기본 모드에서 뛴다. 그리고 시간은 무한하다. 이렇게 하면 라인이 계속 존재할 수 있다.인쇄 보기:
2020-01-19 18:47:51.190543+0800 69. [8095:663010] 1 ...
2020-01-19 18:47:51.190933+0800 69. [8095:663010]
2020-01-19 18:47:54.763623+0800 69. [8095:663010] 1 ...
라인이 활성화되는 목적은 달성되었지만, 이러한 쓰기 방법에는 아직도 문제가 있다.
질문
현재 컨트롤러를 종료할 때, 컨트롤러 LSthread 대상은 삭제되지 않았고, 현재 컨트롤러도 삭제되지 않았습니다. 이것은 둘 다 순환 인용이 발생했기 때문입니다.반복 참조를 생성하는 코드:
self.thread = [[LSThread alloc] initWithTarget:self selector:@selector(start) object:nil];
다음 NSTimer의 유사한 생성 방법을 연상할 수 있습니다. 이러한 생성 실례는 target에 강력한 인용을 만들 수 있습니다.
순환 참조 해결
LSThread 객체를 만드는 방법을 변경하고 Block 사용
self.thread = [[LSThread alloc] initWithBlock:^{
NSLog(@" 1 ...");
NSLog(@" 1 ...");
NSLog(@" ");
[[NSRunLoop currentRunLoop] addPort:[[NSPort alloc] init] forMode:NSDefaultRunLoopMode];
[[NSRunLoop currentRunLoop] run];
NSLog(@" ");
}];
우리는 라인을 활성화시키는 코드를 같은 방법으로 Block에 넣었다.이렇게 하면 순환 인용 문제를 해결할 수 있습니다. 현재 컨트롤러를 종료할 때 컨트롤러도 소각됩니다. 그러나 이 때 우리가 사용하는 LSthread 대상은 소각될 수 없습니다. 이 문제는 다음 글로 남겨 두십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.